Как использовать состояние redux с реактивными перехватчиками

#reactjs #redux #react-hooks

#reactjs #redux #реагирующие перехватчики

Вопрос:

Итак, недавно мы решили начать использовать хуки в нашем текущем приложении react. Мы используем redux для управления состоянием, и мой вопрос был в том, как это работает с перехватчиками?

Я прочитал несколько статей, в которых люди используют context api с помощью hooks для создания менеджера состояний, но я бы хотел пока продолжать использовать redux.

Я знаю, что в react api есть useReducer метод, можно ли его использовать для отправки действий redux? Я искал руководство / пример, но, похоже, не могу найти никаких ресурсов в Интернете для этого. Возможно, я иду по неверному пути, но хотел бы знать, так ли это. Спасибо.

Комментарии:

1. Я наткнулся на этот проект пару дней назад, возможно, это могло бы вам помочь? github.com/dai-shi/react-hooks-easy-redux

2. @KenoClayton Спасибо, что поделились. Я пытался выяснить, есть ли способ сделать это только с помощью нового api hooks

3. Redux уже управляет состоянием вашего компонента, использование useReducer будет управлять вызовами redux вашего компонента, это будет двойной слой, и я действительно не вижу смысла в этом.

4. официального решения для этого пока нет, поскольку необходимо преодолеть некоторые проблемы с производительностью. На данный момент я бы сказал, что лучшим подходом было бы продолжать использовать Redux connect HOC с вашими функциональными компонентами так же, как вы используете компоненты своего класса.

5. К вашему сведению, я создал абстракцию поверх Redux, которая использует перехватчики. Может представлять интерес: github.com/ctrlplusb/easy-peasy

Ответ №1:

При использовании Redux ничего не меняется с хуками, компонент Redux более высокого порядка не имеет ничего общего с хуками. useReducer предназначен не для отправки действий Redux, а для обновления внутреннего состояния компонента таким же образом, как это делает Redux.

Таким образом, при использовании useReducer вы будете отправлять действия, обновлять состояние с помощью редуктора и т.д., Но не состояние Redux! Вместо этого вы делаете это с состоянием компонента.

Компонент, который потребляет useReducer , является стандартным компонентом с внутренним состоянием (для управления входными состояниями или чем угодно еще, что вы хотите), завернутым, как обычно, перед рождением перехватчиков, в Redux’s connect HOC.

Если это может быть полезно, вы можете прояснить свои идеи с помощью этого сообщения

Комментарии:

1. Спасибо. Провел еще несколько исследований и тоже пришел к такому выводу.

2. Этот комментарий очень полезен, мне потребовалось довольно много времени, чтобы понять, что useReducer на самом деле не обновляет состояние Redux. Спасибо!

Ответ №2:

Я не большой пользователь Redux (я предпочитаю MobX ), поэтому я могу упускать из виду некоторые тонкие аспекты. Но из того, что я вижу, это довольно просто, и документы React о хуках предоставляют очень хороший пример:

 const initialState = {count: 0};

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count   1};
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
  }
}

function Counter({initialState}) {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'increment'})}> </button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
    </>
  );
}
  

Вместо reducer этого вы можете просто использовать один из связанных редукторов из вашей существующей базы кода управления состоянием. Просто импортируйте его в файл компонента и передайте useReducer в качестве первого аргумента. Состояние, из которого вы вернетесь, станет новым состоянием для компонента, и он автоматически перезапишет себя с ним. Очевидно, вам нужно будет отключить такой компонент от Redux (если он подключен). В противном случае, как упоминалось в одном из комментариев, вы получите избыточную логику управления состоянием.

Однако на вашем месте я бы не переписывал его для хуков без какой-либо крайней необходимости.