Хуки Реакта: что, зачем и как
Что:
Хуки - это новое АПИ для модных функциональных пацанов (с), которое позволяет отказаться от компонентов-классов. Преимуществом классов была возможность использовать локальное состояние, но с хуками добавлять state можно и в функциональны компоненты. Не путать с хуками жизненного цикла!
Зачем:
1. Переиспользуемость. В классических компонентах для разделения состояния использовали, например, компоненты-обертки. С хуками все проще: пишем логику функциями в отдельном файле, импортируем, вызываем. Всё.
2. Простота. Официальный туториал утверждает: для Реакт-разработчков сложно усвоить правила работы this в JS. Мои соболезнования компаниям, где работают такие девелоперы. Тем не менее, возня с привязкой this сократилась с упрощенной до отсутствующей.
Как:
Все просто. Создаем через деструктуризацию пользовательнкую переменную и метод обновления:
...И применяем, как ранее в классах. О тонкостях, типа useEffect, позже.
Логика, написанная через хуки, полностью независима при каждом вызове. Поэтому useState может быть использована даже в пределах одного компонента.
#React #хуки
Что:
Хуки - это новое АПИ для модных функциональных пацанов (с), которое позволяет отказаться от компонентов-классов. Преимуществом классов была возможность использовать локальное состояние, но с хуками добавлять state можно и в функциональны компоненты. Не путать с хуками жизненного цикла!
Зачем:
1. Переиспользуемость. В классических компонентах для разделения состояния использовали, например, компоненты-обертки. С хуками все проще: пишем логику функциями в отдельном файле, импортируем, вызываем. Всё.
2. Простота. Официальный туториал утверждает: для Реакт-разработчков сложно усвоить правила работы this в JS. Мои соболезнования компаниям, где работают такие девелоперы. Тем не менее, возня с привязкой this сократилась с упрощенной до отсутствующей.
Как:
Все просто. Создаем через деструктуризацию пользовательнкую переменную и метод обновления:
const [age, setAge] = useState(42);
...И применяем, как ранее в классах. О тонкостях, типа useEffect, позже.
Логика, написанная через хуки, полностью независима при каждом вызове. Поэтому useState может быть использована даже в пределах одного компонента.
#React #хуки
Хуки Реакта-2: useEffect
Герой заголовка -
Собственно эффект - это функция, которую и цепляет на себя хук.
Хук эффекта объединяет возможности методов жизненного цикла:
Для того, чтобы выполнять очистку и другие похожие действия, в компонентах-классах привязанные к
useEffect автоматически выполняются для каждого обновления. Сделали так для того, чтобы избежать ошибок с отсутствием прописанной логики обновления компонента.
Однако такое поведение может замедлить приложение. Чтобы отключить его, нужно передать хуку вторым аргументом массив со значением, которое может измениться при обновлении:
useEffect можно использовать многократно в одном компоненте. Это позволит, например, разбить эффекты на те, что должны выполняться всегда, и те, что выполняются только при изменении значения.
#React #хуки
Герой заголовка -
useEffect
- так называемый хук эффекта. Под эффектом понимают действия, которые в компонентах-классах выполняются в методах жизненного цикла. Собственно эффект - это функция, которую и цепляет на себя хук.
Хук эффекта объединяет возможности методов жизненного цикла:
componentDidMount, componentDidUpdate, componentWillUnount
. Это поможет объединить похожую логику, разбитую в классах по методам жизненного цикла. Для того, чтобы выполнять очистку и другие похожие действия, в компонентах-классах привязанные к
componentWillUnount
, хук useEffect должен возвращать функцию: она будет вызвана на этом этапе жизненного цикла.useEffect автоматически выполняются для каждого обновления. Сделали так для того, чтобы избежать ошибок с отсутствием прописанной логики обновления компонента.
Однако такое поведение может замедлить приложение. Чтобы отключить его, нужно передать хуку вторым аргументом массив со значением, которое может измениться при обновлении:
useEffect(() => {
document.title = `Вы нажали ${count} раз
`;}, [count]);
В этом случае эффект будет вызван, только если значение count изменится.useEffect можно использовать многократно в одном компоненте. Это позволит, например, разбить эффекты на те, что должны выполняться всегда, и те, что выполняются только при изменении значения.
#React #хуки
React. Раунд 2!
Готовлюсь ко внутреннему собеседованию по фронту. А значит, время нам с вами повторить пройденное!
- JSX-сущность = результат вызова функции createElement = объект с полями props, children етц.
Если держать в голове этот факт, не забудешь, что вообще такое хреновы пропсы.
- Children - это, если очень грубо, все, что между тегами элемента. <h1> -> тут children <- </h1). Это просто потомки, как в HTML.
- Еще внутри объекта есть key, ref, _owner и не только.
- Корневых узлов может быть несколько.
- Компоненты иммутабельны. То есть, для того, чтобы изменить изображение на экране, нужно перерисовать компонент целиком. Инсертнуть по-быстрому, как в классической верстке, нельзя.
- Обновляется только то, что изменилось. Внутри реакта сравниваются версии элемента "до и после", после чего обновляется только то, что изменилось.
#React
Готовлюсь ко внутреннему собеседованию по фронту. А значит, время нам с вами повторить пройденное!
- JSX-сущность = результат вызова функции createElement = объект с полями props, children етц.
Если держать в голове этот факт, не забудешь, что вообще такое хреновы пропсы.
- Children - это, если очень грубо, все, что между тегами элемента. <h1> -> тут children <- </h1). Это просто потомки, как в HTML.
- Еще внутри объекта есть key, ref, _owner и не только.
- Корневых узлов может быть несколько.
- Компоненты иммутабельны. То есть, для того, чтобы изменить изображение на экране, нужно перерисовать компонент целиком. Инсертнуть по-быстрому, как в классической верстке, нельзя.
- Обновляется только то, что изменилось. Внутри реакта сравниваются версии элемента "до и после", после чего обновляется только то, что изменилось.
#React
- Композиция в React - просто дробление UI на блоки. Больше блок - больше отдельных компонентов. Профит - переиспользуемость.
- Нельзя менять state в обход сеттера setState.
- Нельзя обновлять state с помощью props передачей объекта. Это потому, что state и props обновляются асинхонно, передаваемое значение может быть при этом потеряно. Нужно передавать в сеттер функцию.
- Можно обновлять поля state независимо в отдельных вызовах.
- Вообще state - это как props, только инкапсулированный. Работать со стейтом может исключительно компонент, которому он принадлежит.
- Состояние может быть передано дочерним компонентам. На этом принципе строится архитектура приложений Реакта: данные передаются только от родительских компонентов к дочерним, сверху вниз.
- Синтетическое событие - это обертка Реакта над стандартными событиями DOM. Используется для кроссбраузерности. Его интерфейс аналогичен стандартным событиям, имеется доступ и к оригинальным.
- Как передать аргумент в обработчик события? Поместить его в функцию-стрелку.
#React
- Нельзя менять state в обход сеттера setState.
- Нельзя обновлять state с помощью props передачей объекта. Это потому, что state и props обновляются асинхонно, передаваемое значение может быть при этом потеряно. Нужно передавать в сеттер функцию.
- Можно обновлять поля state независимо в отдельных вызовах.
- Вообще state - это как props, только инкапсулированный. Работать со стейтом может исключительно компонент, которому он принадлежит.
- Состояние может быть передано дочерним компонентам. На этом принципе строится архитектура приложений Реакта: данные передаются только от родительских компонентов к дочерним, сверху вниз.
- Синтетическое событие - это обертка Реакта над стандартными событиями DOM. Используется для кроссбраузерности. Его интерфейс аналогичен стандартным событиям, имеется доступ и к оригинальным.
- Как передать аргумент в обработчик события? Поместить его в функцию-стрелку.
#React
Привязка контекста в React
В компонентах-классах мы передаем обработчики событий в дочерние компоненты. Однако они не выполняются.
Что происходит?
Передавая метод класса в render, мы выполняем примерно следующее:
Как этого избежать?
Жестко привязать контекст метода к объекту. Для этого используем .bind(), стрелочные функции или замыкания. Старый добрый способ - привязать this в конструкторе:
Подробнее: https://learn-reactjs.ru/faq/passing-functions-to-components
#React
В компонентах-классах мы передаем обработчики событий в дочерние компоненты. Однако они не выполняются.
Что происходит?
Передавая метод класса в render, мы выполняем примерно следующее:
const newMethod = obj.method
Представим, что метод возвращает что-то вроде "this.something". Что такое this? Это ссылка на контекст объекта. Когда мы присваиваем метод внешней переменной, то и контекст меняем тоже.Как этого избежать?
Жестко привязать контекст метода к объекту. Для этого используем .bind(), стрелочные функции или замыкания. Старый добрый способ - привязать this в конструкторе:
this.methodName = this.methodName.bind(this)
.Подробнее: https://learn-reactjs.ru/faq/passing-functions-to-components
#React