React Hooks - это новый механизм, появившийся в React 16.8 (2019 год), который позволяет использовать состояние и другие возможности React в функциональных компонентах.
В React встроены некоторые хуки, такие как useState()
, useEffect()
, useContext()
, useReducer()
и другие. Вы также можете создавать собственные хуки для повторного использования логики между компонентами.
Хуки чувствительны к порядку выполнения:
- Устанавливаем Dispatcher;
- Инициализируется очередь хуков, сбрасываем количество рендеров;
- Запускаем функцию компонента;
- После каждого встреченного хука меняем указатель в списке хуков на +1 ;
- После рендера смотрим, были ли изменения стейта? (useState/useReducer dispatch) - если да, то переходим на п.3 увеличивая счётчик рендеров; 25 вызовов компонентов максимально.
Последовательность хуков, формируемая React при первом рендеринге, выглядит следующим образом (представим, что прямоугольники — это хуки, каждый хук содержит указатель на следующий):
Изменили состояние компонента, обновился родительский компонент или же изменился пропс - весь код в теле выполняется при каждом обновлении.
«React следит за тем, какой компонент рендерится в данный момент.… Существует внутренний список ячеек памяти, связанных с каждым компонентом. Они являются JavaScript-объектами, в которых мы можем хранить некоторые данные. Когда вызывается некий хук, например useState(), он читает значение текущей ячейки (или инициализирует её во время первого рендера) и двигает указатель на следующую. Таким способом каждый вызов useState() получит своё независимое состояние.»
- React узнаёт экземпляр компонента, в котором был вызван
useState
; useState
делегирует вupdateReducer
действия в случае обновления (повторного рендеринга)- fiber-волокно будет указывать на экземпляр компонента, который вызывался
useState
, React ставит в очередь повторного рендеринга этого компонента , когда присваивается новое значение состояния;
«…Не вызывайте хуки внутри циклов, условных операторов или вложенных функций. Вместо этого всегда используйте хуки только внутри React-функций, до возврата какого-либо значения из них. Исполнение этого правила гарантирует, что хуки вызываются в одинаковой последовательности при каждом рендере компонента. Это позволит React правильно сохранять состояние хуков между множественными вызовами useState()
и useEffect()
»