tl; dr: Вы должны использовать функциональное обновление синтаксис .
Это больше касается понимания замыканий JavaScript, чем хуков.Чтобы продемонстрировать, что происходит, вот код, основанный на вашем методе increment
, но без каких-либо хуков - просто обычный JavaScript.
async function increment() {
const arr = [];
let nextArr = undefined;
nextArr = [...arr, 'a'];
await pause()
nextArr = [...arr, 'b'];
await pause()
nextArr = [...arr, 'c'];
await pause()
nextArr = [...arr, 'd'];
await pause()
nextArr = [...arr, 'e'];
await pause()
}
В конце этой функции, что вы ожидаетезначение nextArr
будет?['a', 'b', 'c', 'd', 'e']
или ['e']
(подсказка: вы уже видели результат в своем приложении)
nextArr
представляет то, что вы передаете своему установщику состояния.
В качестве стороныобратите внимание, я рекомендую вам использовать соглашение об именах setArr
вместо useArr
для имени переменной установщика.useX
должен быть зарезервирован для пользовательских хуков - не используется для установщиков состояний.
То, что вы хотели сделать, выглядит примерно так:
async function increment() {
const arr = [];
let nextArr = undefined;
nextArr = [...arr, 'a'];
await pause()
nextArr = [...nextArr, 'b'];
await pause()
nextArr = [...nextArr, 'c'];
await pause()
nextArr = [...nextArr, 'd'];
await pause()
nextArr = [...nextArr, 'e'];
await pause()
}
Этот код использует предыдущее значениесоздать следующее значение.Синтаксис функционального обновления может использоваться для получения этого эффекта.С учетом синтаксиса функционального обновления и изменения имен, которые я предложил, ваша функция increment
будет выглядеть следующим образом:
async function increment() {
setArr(prevArr => [...prevArr, 'a'])
await pause()
setArr(prevArr => [...prevArr, 'b'])
await pause()
setArr(prevArr => [...prevArr, 'c'])
await pause()
setArr(prevArr => [...prevArr, 'd'])
await pause()
setArr(prevArr => [...prevArr, 'e'])
await pause()
}
![Edit array functional state update](https://codesandbox.io/static/img/play-codesandbox.svg)