От useState к useEffect: Демистификация основных операций React Hooks
Учебник по React Hooks
Для начала давайте ненадолго напомним себе, что такое хуки React. Представленные в React 16.8 крючки представляют собой набор API-интерфейсов, которые позволяют нам использовать логику с отслеживанием состояния и методы жизненного цикла непосредственно внутри наших функциональных компонентов, не прибегая к компонентам на основе классов. Хуки стали чрезвычайно популярными из-за их способности упрощать структуру кода и улучшать его повторное использование.
Два наиболее распространенных хука, с которыми вы, вероятно, столкнетесь, — это useState
и useEffect
. Хук useState
позволяет вам добавлять состояние к вашим функциональным компонентам, а хук useEffect
позволяет вам выполнять побочные эффекты, такие как выборка данных или прямое управление DOM, аналогично методам жизненного цикла в компонентах на основе классов.
Под капотом useState Hook
Но что происходит, когда мы вызываем эти хуки? Как React отслеживает все эти переменные состояния и эффекты? Начнем с осмотра крючка useState
.
Когда вы вызываете хук useState
, он возвращает массив с двумя элементами. Первый элемент — это текущее значение состояния, а второй — функция, которая позволяет нам обновлять это состояние. Вы можете использовать его следующим образом:
const [count, setCount] = useState(0);
Здесь count
— это текущее состояние (инициализировано как 0
), а setCount
— это функция, которую мы используем для обновления count
.
Но как React управляет этими переменными состояния, особенно когда в одном компоненте есть несколько вызовов useState
? Ответ кроется в порядке вызова хуков. React поддерживает внутренний список хуков для каждого компонента. Каждый раз, когда вызывается хук, React записывает его в этот список, и порядок имеет решающее значение.
При последующих повторных рендерингах компонента React полагается на то, что хуки вызываются в том же порядке. Именно по этой причине вы найдете в документации React, что хуки никогда не должны вызываться условно или внутри циклов. Нарушение этого порядка может привести к ошибкам и несоответствиям в вашем приложении.
Вот упрощенный пример кода, иллюстрирующий, как React может управлять этим: