Хуки в React
В React хук — это функция, которая позволяет вам использовать состояние и другие функции React в функциональных компонентах. Хуки были представлены в React 16.8 как способ написания повторно используемой логики с отслеживанием состояния в функциональных компонентах. В React у нас есть несколько встроенных хуков, таких как useState, useEffect, useContext и т. д.
Реализация хука useState
Простая реализация хука useState в React:
Примечание. Это будет работать только для одного состояния, для большего количества нам нужен массив.
const React = (function () { let _val; function useState(initVal) { const state = _val || initVal; console.log("useState called"); const setState = (newVal) => (_val = newVal); //setter function return [state, setState]; } function render(Component) { const C = Component(); C.render(); return C; } return { useState, render }; })(); function Component() { const [index, setIndex] = React.useState(0); return { render: () => console.log("index: ", index), setIndex: () => setIndex(index + 1), }; } let App = React.render(Component); App.setIndex(); App = React.render(Component); App.setIndex(); App = React.render(Component); App.setIndex(); App = React.render(Component); App.render();
Выход
Объяснение
const React = (function () { ... })();
: объявляет константу с именемReact
и присваивает ей результат немедленно вызванного функционального выражения (IIFE). Целью этого IIFE является создание замыкания и инкапсуляция функцийuseState
иrender
.- Внутри IIFE у нас есть следующий код:
let _val;
: Эта строка объявляет переменную_val
в области действия функции. Он будет использоваться как частная переменная, совместно используемая компонентами.function useState(initVal) { ... }
: это реализация функцииuseState
. Он инициализирует переменнуюstate
текущим_val
илиinitVal
, переданным в качестве аргумента. Он также определяет функциюsetState
, которая устанавливает_val
в новое предоставленное значение. Наконец, он возвращает массив, содержащий функцииstate
иsetState
.function render(Component) { ... }
: это реализация функцииrender
. Он принимает функциюComponent
в качестве аргумента. Он вызывает функциюComponent
, которая, как ожидается, вернет объект с помощью методаrender
. Он вызываетC.render()
для выполнения методаrender
объектаComponent
и возвращает объектComponent
.- Наконец, IIFE возвращает объект, содержащий функции
useState
иrender
.
3. function Component() { ... }
: это пример функции компонента, который предназначен для рендеринга с помощью функции render
. Он определяет вызов useState
, который извлекает функции state
и setState
из объекта React
. Функция Component
возвращает объект с методом render
и методом setIndex
. Метод render
записывает текущее значение index
в консоль, а метод setIndex
увеличивает index
на 1.
4. let App = React.render(Component);
: Эта строка вызывает функцию React.render
с функцией Component
в качестве аргумента. Он присваивает возвращаемое значение переменной App
. Объект App
должен иметь метод render
.
5. App.setIndex();
: эта строка вызывает метод setIndex
для объекта App
, увеличивая значение index
на 1.
6. App = React.render(Component);
: эта строка повторно отображает Component
с помощью функции React.render
и присваивает новый результат переменной App
.
7. Шаги 5 и 6 повторяются несколько раз, чтобы продемонстрировать, как сохраняется и обновляется состояние при нескольких рендерингах.
_val
образует замыкание. Замыкание — это комбинация функции и лексического окружения, в котором эта функция была объявлена. В этом случае функция useState
имеет доступ к переменной _val
, поскольку она объявлена во внешней области действия функции.
Каждый раз, когда вызывается функция useState
, она ссылается на одну и ту же переменную _val
, объявленную во внешней области видимости. Это позволяет сохранять состояние между несколькими вызовами функции useState
и между различными рендерингами Component
.
Надеюсь, вы нашли это полезным.
Обязательно посмотрите видео: https://www.youtube.com/watch?v=KJP1E-Y-xyo