Как мы применяем useState() и useEffect() в React?

Чтобы понять хуки, вы должны иметь хорошее представление о:

  • Реагировать 16.8+
  • Состояние и реквизит
  • Методы жизненного цикла
  • Функциональные компоненты

Какие крючки?

Хуки - это функции JavaScript, которые были добавлены в React в версии 16.8. Они позволяют разработчикам «подключаться» к функциям реагирования и манипулировать состоянием без необходимости писать классы. Их цель не в том, чтобы удалить компоненты класса из React, а в том, чтобы сэкономить время при переключении между классами, функциями, компонентами более высокого порядка и реквизитами рендеринга. Когда вы впервые начинаете практиковать хуки, лучше сначала попробовать их с несложными компонентами, а затем перейти к написанию более сложных, чтобы увидеть их весь потенциал. Их также можно только использовать в функциональных компонентах.

useState () Крюк

Чтобы объявить состояние, вы должны установить две переменные, в этом случае мы будем использовать count и setCount, и установить их равными функции useState(). Аргумент, переданный в функцию useState(), будет нашим начальным значением. Нам нужно установить две переменные, потому что useState() возвращает пару значений. Давайте закодируем это!

import React, {useState} from 'react';
function Counter() {
//Here we declared 'count' and 'setCount'
//count is set to equal 0, and setCount is our function that we will use to update state later
 const [count, setCount] = useState(0);
}

Причина, по которой мы помещаем count и setCount в массив, заключается в том, что, как было сказано ранее, useState() возвращает пару значений. Это называется деструктуризацией массива. Это в основном то, как это выглядит изнутри.

let counterVariable = useState(0);
let counter = counterVariable[0];
let setCounter = counterVariable[1]; 

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

import React, {useState} from 'react';
function Counter() {
//Here we declared 'count' and 'setCount' to equal 0
 const [count, setCount] = useState(0);
 return (
  <div>
   <h1>You clicked me {count} times!</h1>
  </div>
 );
}

Затем давайте добавим кнопку и некоторые функции, которые будут увеличивать наш счетчик при каждом нажатии кнопки. Для этого мы собираемся вызвать другую объявленную нами переменную setCount, которая является функцией и аналогична this.setState() в компонентах класса. Посмотрим, как это выглядит.

import React, {useState} from 'react';
function Counter() {
 const [count, setCount] = useState(0);
return (
  <div>
   <h1>You clicked me {count} times!</h1>
   <button onClick={() -> setCount(count + 1)}
    Click me!!
   </button>
  </div>
 );
}

Вот и все, что касается наших счетчиков! Ничего страшного, если все это поначалу не имеет смысла. Это определенно то, к чему нужно привыкнуть и снова начать с простых функций и развиваться оттуда. Просто нужно много практики!

useEffect () Крюк

Хук useEffect() позволяет вам выполнять побочные эффекты в вашем приложении. Эта функция аналогична componentDidMount, componentDidUpdate и componentWillUnmount. Вы можете думать о useEffect() как о совокупности всех этих трех функций! Аккуратно, правда?

В компонентах класса вы обычно должны иметь componentDidMount и componentDidUpdate с повторяющимся кодом внутри обеих этих функций. Вместо этого с помощью хуков вы просто вызовете useEffect() и передадите то, что вы хотите смонтировать, и response автоматически узнает, когда его обновлять, а когда размонтировать. Давайте воспользуемся примером, с которым мы работали ранее, чтобы показать, как это используется.

import React, {useState, useEffect} from 'react';
function Counter() {
 const [count, setCount] = useState(0);
 useEffect(() => {
  document.title = `You clicked me ${count} times!`;
})
return (
  <div>
   <h1>You clicked me {count} times!</h1>
    <button onClick={() -> setCount(count + 1)}
    Click me!!
    </button>
  </div>
 );
}

Функция, которую мы передаем в useEffect(), - это эффект. Внутри нашей функции мы выбрали заголовок документа. Когда response отображает этот компонент, он запоминает эффект, который мы использовали в нашем useEffect(), и запускает его после обновления DOM. Также хорошо отметить, что функция, которая передается в useEffect(), будет отличаться при каждом рендеринге, потому что у нее всегда будет текущее обновленное значение count. Каждый раз, когда наше приложение выполняет повторную визуализацию, мы действительно заменяем предыдущий эффект другим запланированным эффектом.

Очистка с помощью useEffect ()

Допустим, вы создаете приложение для социальных сетей с помощью API и хотите добавить функцию «добавить друга». При работе с классами вам придется использовать componentDidMount() и componentWillUnmount() для изменения статуса, когда пользователь «дружит» или «удаляет» другого пользователя из друзей. Благодаря хукам, useEffect() упрощает одновременное выполнение обеих этих функций.

import React, { useState, useEffect } from 'react';
function Add(props) {
 const [isFriended, setIsFriended] = useState(null)
 const handleFriendChange = (status) {
  setIsFriended(status.isFriended);
}
 useEffect(() => {
  SocialMediaAPI.addFriend(props.friend.id, handleFriendChange)
  //This function will trigger when the component unmounts
  return () => {
   SocialMediaAPI.removeFriend(props.friend.id, handleFriendChange);
  }
 })
}

Это useState() и useEffect() в двух словах! Если вы хотите погрузиться глубже, узнать о других типах крючков или научиться создавать свои собственные, ознакомьтесь с приведенной ниже документацией. Удачного взлома!