У React Hook useEffect отсутствует зависимость при обновлении состояния на основе текущего значения

#reactjs #react-hooks #dependencies

Вопрос:

Мне нужно обновить текущее значение состояния реакции на основе его текущего значения. Однако использование текущего состояния вызовет предупреждение: React Hook useEffect has a missing dependency . Как я могу обновить состояние?

Для простоты предположим, что мне нужно подсчитать, сколько раз обновляется другое состояние:

 [myState, setMyState] = useState("");
[counter, setCounter] = useState(0);

useEffect(()=>{
 setCounter(counter 1);
},[myState]) // React Hook useEffect has a missing dependency: 'counter'

 

Однако я не могу добавить counter среди зависимостей, так как эффект использования будет входить в бесконечный цикл (так как крючок будет снова активирован из-за counter изменения).

Ответ №1:

Лучший способ реализовать этот тип изменений-использовать обратный вызов внутри setState метода. Используя обратный вызов, мы можем получить доступ к текущему значению нашего состояния без необходимости напрямую ссылаться на объект, содержащий состояние. Таким образом, предупреждение не выдается, и счетчик может быть реализован напрямую.

 [myState, setMyState] = useState("");
[counter, setCounter] = useState(0);

useEffect(()=>{
 setCounter(currentCounter => currentCounter 1);
},[myState]) // No warning here

 

Или если вам нужны более сложные действия:

 useEffect(()=>{
 setCounter(currentCounter => {
   //do stuff
   return currentCounter 1
 });
},[myState]) // No warning here

 

Полная документация: https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

Комментарии:

1. reactjs.org/docs/…

2. @NiceBooks спасибо за ссылку, я забыл упомянуть документацию. Это шаблон, который я очень часто вижу в переполнении стека, поэтому я решил опубликовать сообщение, связывающее проблему, возникающую в результате реакции, с этим решением.