предисловие
С тех пор как React Hooks был запущен, он получил большую популярность, и за этим последовало множество проблем.
В этой статье обсуждается одна из этих тем:React Hooks 是否会取代传统的Redux ?
Я думаю:不会
.
На мой взгляд, по сравнению с традиционным компонентом класса, хуки не предоставляют никаких новых функций состояния, а только расширяют исходный API.
По сравнению с предыдущим, Hoos стал более кратким, а также улучшил удобство использования собственного API и применим ко все большему количеству сценариев.
Чтобы проиллюстрировать мою точку зрения, давайте сделаем несколько повторений.
Что такое Редукс
Редукс — это可预测的状态管理工具
, который можно легко интегрировать в приложения React. Он имеет множество преимуществ, таких как:
- единственный источник правды
- обмен данными
- статус транзакции
- Изолируйте ввод-вывод состояния данных от побочных эффектов
- откат состояния, также известный как
时光机
- Мощные возможности отладки, предоставляемые рядом вспомогательных инструментов
В общем, Redux обеспечивает организацию кода и возможности отладки для крупномасштабных приложений и может помочь вам быстро найти проблему в случае сбоя программы.
Что такое крючки
В следующей статье популяризируются некоторые базовые функции хуков, если интересно, можете посмотреть.
[Полный обзор новых возможностей React: Suspense и Hooks][сегмент fault.com/ah/119000001…]
Основные преимущества хуков:
- Состояние данных может быть определено в функциональных компонентах, а методы жизненного цикла также могут быть смоделированы с помощью некоторых хуков.
- Повторное использование логики; общедоступная логика может быть абстрагирована в отдельные хуки, переходя от традиционного программирования, ориентированного на жизненный цикл, к программированию, ориентированному на бизнес-логику.
- Общее общее поведение, похожее на Render Props.
У обоих есть свои сильные стороны, но теперь есть хуки react-redux (реактивное горячее цинкование. Это .org/next/API/ Хорошо…) и редукционный крюк (реагировать JS.org/docs/hooks-…) такой инструмент, нам не нужно беспокоиться о том, как выбрать между двумя, приятно видеть дождь и росу.
Крючки приносят эти изменения
- Изменен способ написания компонентов, с большим количеством опций, вы можете
抛弃生命周期方
Закон, Крюки объятий. -
Render Props
Эта модель также имеет лучший дом
Какие технологии Хуки не заменят
Redux
HOC
-
容器组件
а также视图组件
Разделение между чистой логикой и визуальными эффектами, которое легче тестировать.
Когда использовать хуки
Вы можете использовать Redux для управления состоянием в любое время. Но если ваше приложение достаточно простое, чтобы содержать одно представление, нуждается в месте для временного сохранения состояния, не нуждается в совместном использовании данных с другими компонентами или вообще не имеет асинхронного ввода-вывода (это не имеет значения ). В это время настало время Хукам показать свои таланты.В этих ситуациях использование Redux конечно возможно, но этот метод называется убийством кур ножом.
Давайте посмотрим пример:
import React, { useState } from 'react';
import t from 'prop-types';
import TextField, { Input } from '@material/react-text-field';
const noop = () => {};
const Holder = ({
itemPrice = 175,
name = '',
email = '',
id = '',
removeHolder = noop,
showRemoveButton = false,
}) => {
const [nameInput, setName] = useState(name);
const [emailInput, setEmail] = useState(email);
const setter = set => e => {
const { target } = e;
const { value } = target;
set(value);
};
return (
<div className="row">
<div className="holder">
<div className="holder-name">
<TextField label="Name">
<Input value={nameInput} onChange={setter(setName)} required />
</TextField>
</div>
<div className="holder-email">
<TextField label="Email">
<Input
value={emailInput}
onChange={setter(setEmail)}
type="email"
required
/>
</TextField>
</div>
{showRemoveButton && (
<button
className="remove-holder"
aria-label="Remove membership"
onClick={e => {
e.preventDefault();
removeHolder(id);
}}
>
×
</button>
)}
</div>
<div className="line-item-price">${itemPrice}</div>
<style jsx>{cssHere}</style>
</div>
);
};
export default Holder;
В приведенном выше примере используется useState для отслеживанияname
а такжеemail
:
const [nameInput, setName] = useState(name);
const [emailInput, setEmail] = useState(email);
Вы можете заметить, что есть также removeHolder, этот создатель действий из Redux. В этом режиме можно смешивать и сочетать различные методы.
До хуков локальное состояние можно было использовать для сохранения и обновления состояния, чтобы справиться с этой ситуацией. Если бы я писал это, я бы предпочел подключить его к Redux и использовать Prop для получения состояния.
В любом случае, все приложения React, которые я сделал до сих пор, использовали Redux, и принцип очень прост:
Используйте состояние компонента для состояния компонента и Redux для состояния приложения. Каждый выполняет свои обязанности и дополняет друг друга.
Когда использовать Редукс
Другой распространенный вопрос:我应该把所有的数据和状态都放在Redux吗?
Если вы этого не сделаете, разве нельзя использовать путешествия во времени?
Ответ - нет.
Поскольку многие состояния в приложении эфемерны, ограничений недостаточно, чтобы предоставить достаточно информации для телеметрии журнала или путешествий во времени. Если то, что вы делаете, не является текстовым редактором с синергией (например, Lark Docs, в котором я участвовал раньше, и документами Tencent и т. д.), вы можете сохранить каждую операцию пользователя и данные каждого набора изменений, включая положение курсора и Дополнительная информация.
Каждый раз, когда вы добавляете данные в Redux, они добавляют уровень абстракции и дополнительную сложность.
Другими словами, каждый раз, когда вы используете Redux, знайте, зачем он вам нужен. Если ваше приложение имеет следующие требования, вы можете рассмотреть возможность использования Redux:
- Необходимо сохранить или загрузить состояние
- Совместное использование состояния между компонентами
- Необходимо разделить бизнес-логику или обработку данных с другими компонентами
Или тот пример:
Ссылка доступа:tddday.com/
import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { compose } from 'ramda';
import page from '../../hocs/page.js';
import Purchase from './purchase-component.js';
import { addHolder, removeHolder, getHolders } from './purchase-reducer.js';
const PurchasePage = () => {
// You can use these instead of
// mapStateToProps and mapDispatchToProps
const dispatch = useDispatch();
const holders = useSelector(getHolders);
const props = {
// Use function composition to compose action creators
// with dispatch. See "Composing Software" for details.
addHolder: compose(
dispatch,
addHolder
),
removeHolder: compose(
dispatch,
removeHolder
),
holders,
};
return <Purchase {...props} />;
};
// `page` is a Higher Order Component composed of many
// other higher order components using function composition.
export default page(PurchasePage);
Этот компонент не обрабатывает DOM, это чисто презентационный компонент, который подключается к Redux с помощью API React-Redux hooks.
Redux используется, потому что другим частям нужны данные для этой формы. Его состояние не локализуется в одном компоненте, а распределяется между компонентами;
Redux позволяет нам четко отделить побочные эффекты от логики других компонентов, не требуя от нас имитации служб ввода-вывода.
Причина, по которой я предпочитаю использовать redux-saga вместо redux-thunk, заключается в функции изоляции последнего).
Чтобы догнать Redux в этом случае использования, API React должен обеспечить изоляцию побочных эффектов.
Редукс — это архитектура
Redux сильно отличается от библиотек управления состоянием. Но по сути это тоже подмножество архитектуры Flux.
Redux всегда был ближе к архитектурному и необязательному соглашению, чем к библиотеке.
На самом деле базовая реализация Redux требует всего несколько десятков строк кода.
Это также большое преимущество Redux. Если вы хотите использовать больше нативных состояний компонентов и хуков API и не хотите втискивать все в Redux, это прекрасно.
React предоставляет хук useReducer, который вы можете использовать для подключения к редуктору в стиле Redux. Это полезно для логики необычного состояния, зависимого состояния и т. д.
Если ваш вариант использования заключается в загрузке временного состояния в один компонент, вы также можете использовать архитектуру Redux, но использовать хук useReducer вместо Redux для управления состоянием.
Если вам нужно сохранить или поделиться этим состоянием позже, вам нужно сохранить его в Redux.
Эпилог
Хуки не заменят традиционный Redux. Его появление дает нам больше гибкости и больше возможностей для написания компонентов. Я надеюсь, что все FEers смогут вовремя освоить эту новую функцию и найти свою любимую позу разработки ~
Написано поверхностно, если есть неточности прошу поправить.
Оригинальная ссылка прилагается:medium.com/JavaScript-...