#reactjs #react-hooks
Вопрос:
У меня есть массив в состоянии реакции. Я помещаю в него значения таким образом, который, как я предполагал, был правильным, но массив всегда пуст, когда я пытаюсь его зарегистрировать. Как насчет того, что мой метод нажатия на массив неверен?
const [betHistory, setBetHistory] = useState([""]);
Внутри моей функции (которая, как я проверил, вызывается, и счет ставок никогда не бывает пустым)
function placeBet() { console.log(betCount); setBetHistory(betHistory =gt; [...betHistory, betCount.toString()]); console.log(betHistory); }
Журнал всегда пуст.
Комментарии:
1.
betHistory
следует обновлять при следующем рендеринге, а не сразу там, где у вас есть журнал. Попробуйте войтиbetHistory
в систему в верхней части функции визуализации.2. Кстати , у вас есть две переменные в области видимости, называемые
betHistory
, например. параметр может быть переименованsetBetHistory(oldBetHistory =gt; [...oldBetHistory, betCount.toString()]);
. Это просто для того, чтобы избежать путаницы.3. setBetHistory принимает массив, а не функцию…. также вам может быть лучше создать переменную для хранения нового массива const newArr = […betHistory]; вызов newArr.push(betCount. toString()) , затем setBetHistory(newArr)……….. Также, почему вы используете массив? набор только из одной вещи?
4. @JonathanAlfaro он может принимать значение данных (в данном случае массив) или функцию, так что часть кода в порядке.
Ответ №1:
Установка состояния обновит значение при следующем рендеринге, а не сразу. Если вам нужно сразу получить доступ к обновленному значению, сохраните его в переменной:
function placeBet() { const newBetHistory = [...betHistory, betCount.toString()]; setBetHistory(newBetHistory); console.log(newBetHistory); }
Комментарии:
1. Спасибо за ответ. Я изменил журнал с newBetHistory на betHistory, и он отлично регистрируется, показывает все значения, которые были перенесены. Можете ли вы придумать причину, по которой, если у меня есть console.log(betHistory) в другой функции, которая вызывается после того, как было передано несколько значений, в этой функции журнал снова пуст, как будто никаких значений не было передано. Несмотря на то, что в журнале placeBet() отображаются значения?
2. Другая функция, кстати, вызывается родителем с помощью useRef. Ужасный дизайн, я знаю, но почему, когда родитель вызывает функцию, которая регистрирует betHistory, она снова пуста, несмотря на то, что значения перемещаются?
3. «вызывается после того, как было передано несколько значений» — но является ли это одним и тем же вызовом для визуализации? Это следующий рендеринг, в котором вы ожидаете увидеть обновленное значение в
betHistory
4. Привет, я не вызываю никакую функцию рендеринга? Мои родитель и ребенок являются функциональными компонентами, в моем index.js есть вызов для рендеринга с родителем в нем, у родителя есть ребенок в его jsx
5. Хорошо, тогда ваша «функция визуализации» на самом деле является просто телом анонимной функции. Попробуйте войти
betHistory
в систему сразу послеuseState
этого, и я уверен, что вы увидите правильное значение после установки значения.