Что означает, что идентичность стабильна и не изменится при повторном рендеринге?
Функция, возвращаемая useState
, не будет меняться в течение циклов рендеринга.То есть функция диспетчеризации, возвращенная в первом цикле рендеринга, все еще может быть вызвана после, скажем, 10-го цикла рендеринга для установки состояния.Это позволяет вам установить хук с помощью функции диспетчеризации в любой точке без необходимости обновлять хук при изменении ссылки на функцию.
useEffect(() => {
setCount(initialCount);
}, [ initialCount, setCount ]); // <--- setCount is not needed here
Я вижу, что для каждой кнопки передается анонимная функциякак обработчик событий.Даже если идентичность setState стабильна, как утверждает React, это правда, не будет ли анонимная функция воссоздана при каждом повторном рендеринге?
Да, это правда, что функции стрелок будут перестраиваться наповторная визуализация.Альтернативой является использование useCallback
для запоминания обратного вызова, но какой ценой?Стоимость вызова useCallback
, стоимость запоминания этого обратного вызова, стоимость создания ссылок на него и стоимость извлечения этого обратного вызова при каждом повторном рендеринге значительно перевешивает преимущества простого создания функции при каждом повторном рендеринге.
Сама функция useCallback
имеет длину 20 строк с 3 другими вызовами вложенных функций для других внутренних API React.Все это, чтобы предотвратить создание одной строковой функции на каждом рендере?Математика просто не складывается в пользу useCallback
.Единственный полезный сценарий - это когда вы хотите, чтобы ваши обратные вызовы имели «стабильную идентичность» либо по ссылке, либо по какому-либо другому механизму, чтобы вы могли передавать обратный вызов как реквизиты, не вызывая чрезмерных повторных рендерингов.