React Context против React Redux, когда мне следует использовать каждый из них? [закрыто]

187

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

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

Alfrex92
источник
Если вы сравниваете Redux и React Context API, это потому, что вы хотите только синхронизировать переменные между компонентами. Проверьте duixпакет npm. Это всего лишь простой менеджер состояний с обратными вызовами, который очень легко реализовать. Просто чтобы быть ясно: я создатель.
Брода Ноэль

Ответы:

208

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

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

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

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

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

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

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

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

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

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

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

Шубхам Хатри
источник
Хорошо, а как насчет повторного использования? Контексты могут быть полностью использованы повторно, как только приставка + тук, и особенно сундук + сага, почти не используются.
Юрий Хайови
4
@Daggett Одна вещь, которую нам нужно понять, - это то, что избыточность не является контекстом, она основана на контексте, хранилище, которое вы передаете, передается контекстом, а также можете ли вы уточнить, что вы подразумеваете под повторным использованием
Шубхам Хатри,
Даже разработка такой базовой вещи, как многоразовый контейнер с побочными эффектами, превращается в кошмар с избыточностью. Redux тесно связан с уровнем приложения, и вы можете сказать, что он по-прежнему можно использовать повторно и т. Д. И т. Д., Но, говоря о многоразовости, я имею в виду полностью повторно используемую ... Без спагетти с шипами, собранный в виде отдельного пакета, и может быть повторно использован независимо для настройки приложения. ,
Юрий Хаиовый
@YuriiHaiovyi Я согласен с твоими вопросами. Этот ответ является в основном скомпилированной версией того, что говорится в связанных постах блога. Ничего общего с разделением собственной перспективы, как будто я использовал только контекст, а затем я застрял и почувствовал, что это плохой выбор по некоторым причинам x, y, z, а затем перешел на Redux, Mobx, который решил эту проблему ... или наоборот история например. В основном люди спрашивают или ищут это, чтобы увидеть, есть ли какие-то истории плохие или хорошие, которые могут затем помочь читателям думать и принимать взвешенные решения ... Итак, мой вопрос, какой путь вы выберете?
Аруп Ракшит
4
Какая часть излишка не пригодна для повторного использования? Вы можете легко повторно использовать редукторы, селекторы, действия и создателей действий в другом приложении с редуктом (реагировать, даже угловым).
Давид Мольнар
85

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

С другой стороны, если вы используете Redux для всего остального (наличие предсказуемого контейнера состояний, обработка логики вашего приложения вне ваших компонентов, централизация состояния вашего приложения, использование Redux DevTools для отслеживания, когда, где, почему и как состояние вашего приложения изменив или используя плагины, такие как Redux Form , Redux Saga , Redux Undo , Redux Persist , Redux Logger и т. д.), тогда нет абсолютно никаких причин для отказа от Redux. ContextAPI не предоставляет какой - либо из этого.

И я лично считаю, что расширение Redux DevTools - это удивительный, недооцененный инструмент отладки, который сам по себе оправдывает продолжение использования Redux.

Некоторые ссылки:

GG.
источник
12

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

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

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

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

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

vijayst
источник
10

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

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

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

Себастьян Лорбер
источник
1
  • Если вам нужно использовать промежуточное ПО для различных целей. Например, регистрация действий, сообщения об ошибках, отправка других запросов в зависимости от ответа сервера и т. Д.
  • Когда данные, поступающие с нескольких конечных точек, влияют на один компонент / представление.
  • Когда вы хотите иметь больший контроль над действиями в ваших приложениях. Redux позволяет отслеживать действия и изменения данных, что значительно упрощает отладку.
  • Если вы не хотите, чтобы ответ сервера напрямую изменял состояние вашего приложения. Redux добавляет слой, где вы можете решить, как, когда и следует ли применять эти данные. Шаблон наблюдателя. Вместо создания нескольких издателей и подписчиков для всего приложения, вы просто подключаете компоненты к магазину Redux.

С: Когда использовать Redux?

Михал Рейман
источник