Array.concat () возвращает пустой массив - PullRequest
1 голос
/ 15 октября 2019

Я создаю веб-приложение, используя React 16.10, и когда я пытаюсь добавить элемент в пустой массив, используя Array.concat(), сначала он возвращает пустой массив, а после второй попытки он возвращает расширенный массив.

Причины, по которым я не использую Array.push():

Вот код:

const [pizzas, setPizzas]= useState([]);

const addPizza = (type, size, dough, price) => {
    setPizzas(pizzas.concat([{type, size, dough, price}]));
    console.log(pizzas);
}

Функция addPizza срабатывает при нажатии кнопки. Когда я щелкаю по нему в первый раз, консоль возвращает [], но когда я щелкаю по нему во второй раз, она возвращает расширенный массив: [{...}].

Странно то, что когда я пытаюсь сделать что-то подобноев консоли браузера работает правильно:

const a = [];

a.concat({name: 'James'}); // returns [{name: 'James'}]

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

.concat() не изменяет Array;он возвращает новый массив, содержащий конкатенацию. Таким образом, эта строка устанавливает pizzas state при следующем рендеринге в массив с новым элементом:

setPizzas(pizzas.concat([{type, size, dough, price}]));

... потому что она как бы переводит в это:

const newPizzas = pizzas.concat([{type, size, dough, price}]);
setPizzas(newPizzas);

... но локальная переменная pizzas, которую вы регистрируете, не изменяется. Однако при следующем вызове useState новое значение будет иметь pizzas.

0 голосов
/ 15 октября 2019

состояние установки в React является асинхронным. Когда вы вызываете сеттер, полученный из useState, у вас есть гарантия, что в будущем функция будет вызываться с новым обновленным состоянием.

Она не обновляет существующую ссылку (на pizzas) - скорее, она вызывает функцию с новой.

Вот как работает состояние в реакции - предположительно, чтобы создать видимость неизменности внутри рендера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...