React Context vs React Redux, когда я должен использовать каждый из них?

React 16.3.0 был выпущен и контекст API больше не является экспериментальной функцией. Дан Абрамов (создатель Redux) написал хороший комментарий здесь об этом, но это было 2 года, когда контекст был все еще экспериментальная функция.

мой вопрос, на ваш взгляд/опыт, когда я должен использовать Реагировать Контексте над React Redux и наоборот?

4 ответов


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

как написал Марк Эриксон в своем блог:

если вы используете только Redux, чтобы избежать передачи реквизита, контекст может замените Redux-но тогда вам, вероятно, не нужен Redux в первом место.

контекст также не дает вам ничего подобного Redux DevTools, в возможность отслеживать обновления состояния,middleware добавить централизованного логика приложения и другие мощные возможности, которые Redux давать возможность.

Redux является гораздо более мощным и обеспечивает большое количество функций, которые Context Api не предоставляет, также как @danAbramov указано

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

его до Redux фактически обновить свою реализацию, чтобы придерживаться последнего контекста API

последний контекст API может использоваться для приложений, где вы просто используете Redux для передачи данных между компонентами, однако приложение которые используют централизованные данные и обрабатывают запрос API в создателях действий, используя redux-thunk или redux-saga еще необходимо "возвращение". Помимо этого redux имеет другие библиотеки, связанные как redux-persist которые позволяют сохранять данные хранилища в localStorage и регидрировать при обновлении, что по-прежнему не поддерживает контекстный API.

как @dan_abramov упомянул в своем блоге возможно, Вам не понадобится Redux, что Redux имеет полезное приложение, как

  • сохраняйте состояние в локальном хранилище, а затем загружайтесь из него, из коробки.
  • предварительно заполните состояние на сервере, отправьте его клиенту в HTML и загрузите из него, из коробки.
  • Сериализуйте действия пользователя и присоедините их вместе с моментальным снимком состояния к автоматическим отчетам об ошибках, чтобы разработчики продукта
    может воспроизводить их для воспроизведения ошибок.
  • передача объектов действия по сети для реализации среды совместной работы без резких изменений в способе написания кода.
  • поддерживать историю отмены или реализовать оптимистические мутации без резких изменений в том, как написан код.
  • перемещение между историей состояния в разработке и переоценка текущего состояния из истории действий при изменении кода, a Ла ТДД.
  • снабдите полные возможности осмотра и контроля оборудовать развития так, что разработчики продуктов могут создавать пользовательские инструменты для своих
    приложения.
  • обеспечьте альтернативный UIs пока повторно использующ большую часть из бизнес-логики.

С этими многими приложениями его слишком рано говорить, что Redux будет заменен новым контекстным API


Если вы используете Redux только для того, чтобы избежать передачи реквизита до глубоко вложенных компонентов, тогда вы можете заменить Redux на Context API-интерфейс. Он точно предназначен для этого случая использования.

С другой стороны, Если вы используете Redux для всего остального (имея предсказуемый контейнер состояний, обрабатывая логику вашего приложения вне ваших компонентов, сохраняя историю обновлений состояния, используя Redux DevTools, Redux Отменить, Redux Упорствуют, Redux Форма, Redux Saga, Redux Logger и т. д.), Тогда нет абсолютно никаких причин для вас заменять Redux на Context API-интерфейс.

ссылки:


Я предпочитаю использовать redux с redux-thunk для выполнения вызовов API (также используя Axios) и отправки ответа на редукторы. Это чисто и легко понять.

контекстный API очень специфичен для части react-redux о том, как компоненты React подключены к магазину. Для этого react-redux хорош. Но если вы хотите, поскольку контекст официально поддерживается, вы можете использовать API контекста вместо react-redux.

Итак, вопрос должен быть контекстным API vs react-redux, а не контекстный API против redux. Кроме того, вопрос немного самоуверенный. Поскольку я знаком с react-redux и использую его во всех проектах, я буду продолжать его использовать. (У меня нет стимула меняться).

но если вы изучаете redux только сегодня, и вы не использовали его нигде, стоит дать Context API выстрел и заменить react-redux с вашим пользовательским кодом API контекста. Может быть, так намного чище.

лично, это вопрос панибратства. Нет четкой причины выбирать одно над другим, потому что они эквивалентны. И внутренне react-redux использует контекст в любом случае.


единственные причины использовать Redux для меня:

  • вам нужен глобальный объект состояния (по различным причинам, таким как отладочность, постоянство...)
  • ваше приложение является или будет большим и должно масштабироваться для многих разработчиков: в таком случае вам, вероятно, нужен уровень косвенности (т. е. система событий): вы запускаете события (в прошлом), а затем люди, которых вы не знаете в своей организации, могут их слушать

вам, вероятно, не нужен уровень косвенность для всего вашего приложения, поэтому хорошо смешивать стили и использовать локальное состояние/контекст и Redux одновременно.