То, что у вас есть в демоверсии, немного отличается от того, что у вас есть в посте.
Обратите внимание, что то, что вы пишете в сообщении, не вызовет бесконечное l oop, а дочерняя кнопка onClick будет go через следующие шаги
- Обновить дочернее состояние str
- Запуск дочернего useEffect и вызов родительского метода обновления
- функция обновления увеличивает значение счетчика и повторно отображает родительский
- дочерний компонент повторно визуализируется
Однако в демонстрации у вас есть
React.useEffect(() => {
update();
}, [str, update]);
Однако вышеупомянутый useEffect вызовет бесконечное l oop. Причина в том, что когда функция обновления запускается, она обновляет состояние, что в основном приводит к созданию нового экземпляра обновления при повторной визуализации родительского компонента, поскольку зависимость useCallback изменилась.
Правильный способ определения useCallback будет использовались setCount
с функциональным шаблоном и не учитывались как зависимость от useCallback
, как показано ниже, и тогда все будет работать нормально
const update = React.useCallback(() => {
setCount(prevCount => prevCount + 1);
}, [setCount]);
Рабочая демонстрация