DevGang
Авторизоваться

Зачем использовать React Hooks? 

В наши дни все говорят о хуках React. Работа с ними требует небольшого изменения мышления, когда вы так долго работали с классами компонентов React. Команда React специально сказала, что они продолжат поддерживать классы, так зачем использовать хуки?

Рабочий пример

Пример, с которым мы работаем - это просто кнопка с активным состоянием. Переключает цвета при нажатии.

Поиграть с кодом можно тут

Начало

Допустим, у нас есть мертвый простой компонент кнопки, как показано ниже. Мы хотим, чтобы это была глупая компонента, поэтому мы делаем ее функциональной:

const Button = props => {
 return (
   
{props.text}
); };

Хорошо отлично Мы можем передать пользовательский обработчик onClick и свойство text.

Но подождите ... что если мы захотим изменить цвет кнопки, когда она активна? Допустим, у нас уже есть 100 компонентов, использующих эту кнопку. Мы не хотим добавлять другое свойство, и изменение цвета кажется достаточно простым, чтобы позволить кнопке управлять.

Преобразование в класс

Единственная проблема в том, что нам понадобится какое-то состояние. Хорошо, давайте предположим, что это дни до реализации хуков. Теперь нам нужно преобразовать наш пример в класс, чтобы получить доступ к state:

class ButtonWithClass extends React.Component {
 state = {
   active: false
 };
 render() {
   return (
     
{ this.setState({active: !this.state.active}); this.props.onClick(); }} > {this.props.text}
); } }

Тьфу… нам пришлось полностью переписать наш компонент, добавить на 200% больше строк кода, и все, что мы хотели - это добавить одно состояние. Ваш PR-обозреватель увидит много красного и зеленого, и никому не нравится рождественский PR. Можем ли мы сделать лучше? Чертовски верно, мы можем.

Хуки нам на помощь!

Добавление хуков

Давайте посмотрим, что происходит, когда мы делаем то же самое с перехватчиками React:

const ButtonWithHook = props => {
 const [active, setActive] = useState(false);
 return (
   
{ setActive(!active); props.onClick(); }} > {props.text}
); };

Посмотри на этот сексуальный компонент. Нам не нужно было ничего переписывать. Все, что мы сделали, это добавили несколько строк и обновили нашу функцию onClick, и мы получили тот же результат, что и версия класса. Не нужно ссылаться на this и беспокоиться о контексте. Мы счастливы, и наш PR-обозреватель счастлив. Для добавления состояния требуется только одна строка:

const [active, setActive] = useState(false)

Рефакторинг

Но подожди! Почему наша кнопка управляет своим собственным состоянием? Допустим, мы передумали и хотим, чтобы наш компонент был глупым, чтобы мы могли выглядеть умно. Мы хотим чтобы active был props, которым будут управлять ее родители. Нет проблем! При использовании React-Hooks нам просто нужно удалить строки 2 и 7 и часть строки 5:

const ButtonWithHook = props => {
 const [active, setActive] = useState(false); /***** DELETE *****/
 return (
   
{ setActive(!active); /****** DELETE ******/ props.onClick(); }} > {props.text}
); };

Это было так легко, что вы должны плакать от слез радости. Посмотрите, насколько сложно преобразовать наш класс обратно в функцию:

class ButtonWithClass extends React.Component { // restructure whole thing to be an arrow function again
 state = { // DELETE
   active: false // DELETE
 }; // DELETE
 render() { // DELETE
   return (
     
{ this.setState({ active: !this.state.active }); // DELETE this.props.onClick(); // remember to remove "this" context (you won't) }} > {this.props.text} //remember to remove "this" context again (you won't.. again)
); } // DELETE }

К тому времени, когда вы преобразуете свой компонент обратно в функцию, вы, вероятно, разочарованы. Человек, просматривающий ваш код, получит еще один пиар на тему Рождества, и вы будете чувствовать себя глупо, даже если фактическое изменение было незначительным. Вы говорите себе, что в следующий раз вы просто оставите это как класс на случай, если вы снова передумаете. Понятно, что мы должны были изменить строки 1, 2, 3, 4, 5, 8, 10, 11, 14 и 17. Если мы просто используем React Hooks, нам не нужно думать о состоянии, прежде чем писать наш компонент.

Резюме

React Hooks позволяют вам сохранять ваши функциональные компоненты как функции и привязывать состояние к специфическим функциям React. Вот и все. Такой простой, но такой мощный. Вот список преимуществ React Hooks (большинство из которых я, возможно, не охватил, я просто хотел поделиться тем, что я считаю наиболее очевидным преимуществом):

  • Ненужно переписывать, чтобы включить или исключить состояние, просто добавление / удаление строк.
  • Нет необходимости запоминать методы жизненного цикла с помощью useEffects (см. Здесь)
  • Настраиваемый и многократно используемый в компонентах в отличие от состояния компонента класса (подробнее здесь)
  • Гораздо чище код (подробности см. Здесь)
  • Никаких серьезных изменений (см. Здесь)
#React
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться