Вот что вы узнаете:
- почему React хуки
- как использовать перехватчики React
- как та же логика будет реализована в компонентах класса React
Требования
- ES6 (стрелочные функции, деструктуризация, классы)
- Реагировать
Настройка проекта React
Если вы хотите следовать примерам, обязательно настройте среду разработки React. Запустить:
ловушки для изучения npx create-response-app
и тебе хорошо! (У вас должна быть одна из последних версий Node.js для запуска npx).
Раньше у вас был setState с классами ES6 React
Я не буду здесь углубляться, я предполагаю, что вы уже используете React в своем проекте, но позвольте мне сделать краткий обзор.
React - это библиотека для создания пользовательских интерфейсов, и одним из ее преимуществ является то, что сама библиотека налагает строгий поток данных на разработчика. Вы помните jQuery? С jQuery практически невозможно четко структурировать проект, не говоря уже о том, чтобы определить, как данные должны передаваться через пользовательский интерфейс. Трудно отследить, какая функция какая часть пользовательского интерфейса меняет.
То же самое относится и к простому JavaScript: даже если с самодисциплиной и практикой можно создать хорошо структурированный проект (думая о шаблоне модуля), удачное состояние отслеживания и взаимодействия между функциями (это можно сделать, но без внешняя помощь, см. Redux).
Эти проблемы были несколько облегчены React: за счет обеспечения четкой структуры (контейнер и функциональные компоненты) и строгого потока данных (компоненты реагируют на изменение состояния и свойств) теперь легче, чем раньше, создавать хорошо аргументированные Логика пользовательского интерфейса.
Итак, теория React состоит в том, что часть пользовательского интерфейса может «реагировать» на изменение состояния. До сих пор основной формой для выражения этого потока был класс ES6. Рассмотрим следующий пример, класс ES6, расширяющийся от React.Component, с внутренним состоянием:
Как видно из приведенного выше кода, внутреннее состояние компонента изменяется с помощью setState при нажатии кнопки. Текстовая кнопка по очереди реагирует на это изменение и получает обновленный текст.
Более сжатую версию компонента можно выразить удалением конструктора благодаря полям класса:
Итак, вначале был setState (и будет). Но сохраняйте спокойствие. Вышеупомянутый стиль идеален, и классы ES6 в React не исчезнут в ближайшее время.
Но теперь с помощью перехватчиков React можно выразить изменение внутреннего состояния потока - ›реакция пользовательского интерфейса без использования класса ES6.
Хуки в действии: давайте обновим состояние в React без использования setState
Итак, какие возможности у нас есть для управления внутренним состоянием в React теперь, когда setState и классы больше не нужны?
Введите первый и самый важный перехватчик React: useState. useState - это функция, предоставляемая пакетом реакции. Вы импортируете эту функцию в начало ваших файлов как:
импортировать React, {useState} из «реакции»;
Импортируя useState в свой код, вы сигнализируете о намерении сохранить какое-то состояние внутри вашего компонента React. И что более важно, этот компонент React больше не должен быть классом ES6. Это может быть простая функция JavaScript. Это самая интересная вещь в истории с крючками.
После импорта useState вы выберете массив, содержащий две переменные из useState, и код должен войти в ваш компонент React:
const [buttonText, setButtonText] = useState («Щелкните меня, пожалуйста»);
Смущает этот синтаксис? Это деструктуризация ES6. Вышеупомянутые имена могут быть любыми, для React это не имеет значения. В любом случае я советую использовать описательные и содержательные имена переменных в зависимости от цели государства.
аргумент, переданный в useState, - это фактическое начальное состояние, данные, которые могут быть изменены. useState возвращает вам две привязки:
- фактическое значение для государства
- функция обновления состояния для указанного состояния
Таким образом, в предыдущем примере компонент кнопки с хуками становится следующим:
Для вызова средства обновления состояния setButtonText внутри обработчика onClick можно использовать встроенную стрелочную функцию. Но если вы предпочитаете использовать обычную функцию, вы можете:
Честно говоря, мне нравятся обычные функции больше, чем стрелочные, если у меня нет особых требований. Читаемость значительно улучшается. Кроме того, когда я пишу код, я всегда думаю о следующем разработчике, который будет поддерживать этот код. И мой код должен быть читабельным.
Реагирующие хуки, вот и все! Я мог бы закончить этот пост здесь, но не раньше, чем покажу вам как получать данные с помощью хуков.
Раньше вы использовали componentDidMount для обработки операции выборки данных.
Получение данных в React! Вы помните старые времена componentDidMount? Вы можете щелкнуть fetch (url) в componentDidMount и назвать это днем. Вот как получить массив данных из API для визуализации красивого списка:
Хуки в действии: давайте посмотрим, как хуки будут использоваться для операций выборки данных.
Я думал, что получение данных с помощью хуков React не должно сильно отличаться от useState. Беглый взгляд на документацию подсказал мне: useEffect может быть подходящим инструментом для работы.
Я прочитал: «useEffect служит той же цели, что и componentDidMount, componentDidUpdate и componentWillUnmount в классах React, но объединен в единый API»
Бинго! Это потрясающе, не правда ли? Обладая этими знаниями, я реорганизовал Dataloader для использования useEffect. Компонент становится функцией, а выборка вызывается внутри useEffect. Более того, вместо вызова this.setState я могу использовать setData (произвольная функция, извлеченная из useState):
В этот момент я подумал: «Что может быть не так?» и я запустил приложение. Вот что я увидел в консоли:
Очевидно, это была моя вина, потому что я уже получил представление о том, что происходит:
«useEffect служит той же цели, что и componentDidMount, componentDidUpdate и componentWillUnmount»
componentDidUpdate! componentDidUpdate - это метод жизненного цикла, который запускается каждый раз, когда компонент получает новые реквизиты или происходит изменение состояния.
Это уловка. Если вы вызовете useEffect, как я, вы увидите бесконечный цикл. И для решения этой «ошибки» вам нужно будет передать пустой массив в качестве второго аргумента для useEffect:
Выполнено!
Крючки: Заключение
Перехватчики React - хорошее дополнение к библиотеке. Созданные как RFC в октябре 2018 года, они быстро догнали и перешли на React 16.8. Думайте о перехватчиках React как о инкапсулированных состояниях, находящихся вне ваших компонентов React.
Перехватчики React делают реквизиты рендеринга и HOC практически устаревшими и обеспечивают лучшую эргономику для обмена логикой. С помощью хуков React вы можете повторно использовать общие части логики между компонентами React.
React поставляется с кучей предопределенных хуков. Наиболее важными из них являются useState и useEffect. useState позволяет использовать локальное состояние внутри компонентов React, не прибегая к классам ES6.
useEffect заменяет componentDidMount, componentDidUpdate и componentWillUnmount, предоставляя унифицированный API. Есть много других ловушек, и я предлагаю прочитать официальную документацию, чтобы узнать больше.
Легко предугадать, куда движется React: функциональные компоненты повсюду! Но даже тогда у нас будет 3 способа выражения компонентов в React:
- функциональные компоненты
- компоненты класса
- функциональные компоненты с крючками
Хуки: ссылки для обучения
Я надеюсь, что эта статья поможет вам понять, насколько важны React Hooks и как вы можете их использовать.