Вопрос по redux, reactjs, javascript – Реагировать с Redux? А как насчет проблемы контекста?

81

Я обычно публикую материалы, связанные с кодом, в стеке, но это больше вопрос о том, каковы общие мысли сообщества.

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

Redux

Внизу этой страницы:http://redux.js.org/docs/basics/UsageWithReact.html (Проходя через магазин) он рекомендует использовать «Магию» React «Context».

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

Мы рекомендуем использовать специальный компонент React Redux, призванный волшебным образом сделать хранилище доступным для всех компонентов контейнера ...

реагировать

На странице Контекст реагирования (https://facebook.github.io/react/docs/context.html) наверху есть предупреждение:

Контекст - это продвинутая и экспериментальная функция. API, вероятно, изменится в будущих выпусках.

Тогда внизу:

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

Не используйте контекст для передачи данных вашей модели через компоненты. Явная передача данных через дерево намного проще для понимания ...

Так...

Redux рекомендует использовать функцию React «Context» вместо передачиstore вниз до каждого компонента через «реквизит». Пока React рекомендует обратное.

Кроме того, похоже, что Дэн Абрамов (создатель Redux) теперь работает на Facebook (создатель React), просто чтобы сбить меня с толку.

Я читаю все это правильно ..?Каково общее текущее согласие по этому вопросу ..?
Ааа, это отличный вопрос, мне очень интересно услышать мнение других! Я немного боюсь, что это закроется из-за аспекта обсуждения. Я действительно надеюсь, что это не так. mjohnsonengr

Ваш Ответ

3   ответа
4

  что, как правило, любой код, за который я отвечаю, не будет его потреблять).IКогда я тестирую свои компоненты, я тестирую неупакованный компонент. Поскольку response-redux пропустил только те реквизиты, которые мне были необходимы для этого компонента, теперь я точно знаю, какие реквизиты мне нужны, когда я пишу тесты.

Полагаю, суть в том, что я никогда не вижу слова контекста в своем коде, я не использую его, поэтому в определенной степени это не влияет на меня! Это ничего не говорит об «экспериментальном» предупреждении Facebook. Если контекст исчезнет, ​​я буду так же, как и все остальные, до обновления Redux.

Интересно ... Я понимаю, что ты имеешь в виду, когда реагируешь на избыточность

Есть модуль npm, который позволяет очень просто добавить излишний в контекст реакции Stephen Last
Я спросил Дана о его мыслях через Twitter ... Хороший ответ, в том же духе ... Используйте библиотеку, которая использует Context, не используйте ее напрямую. mjohnsonengr
 а такжеProvider абстрагироваться от всего контекста. Я предполагаю, что с Даном Абрамовым, находящимся сейчас в FB, вы бы надеялись, что если Context изменится Redux, и «response-redux» будет обновлен ... Но никаких гарантий, хотя, и «экспериментальное» предупреждение FB все еще есть на всеобщее обозрение.connectУ меня, безусловно, есть надежда, что если FB не будет держать в своем поле response-redux в случае, если что-то случится с контекстом, разработчик с открытым исходным кодом где-то более знаком с redux, чем я; если нет, то я разберусь и сделаю это сам! Stephen Last
82

ых случаях его преимущества перевешивают его недостатки, поэтому некоторые библиотеки, такие как React Redux и React Router, предпочитают полагаться на него, несмотря на экспериментальный характер.

Важной частью здесь является словобиблиотеки, Если контекст меняет свое поведение,нам, как авторам библиотеки, нужно будет, Однако, пока библиотека не просит вас напрямую использовать контекстный API, вам, как пользователю, не нужно беспокоиться об изменениях в нем.

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

В конечном счете, React Redux по-прежнему поддерживает постоянную передачу хранилища в качестве поддержки, поэтому, если вы хотите полностью избежать контекста, у вас есть такой выбор. Однако я бы сказал, что это нецелесообразно.

TLDR: избегайте прямого использования контекста, если вы действительно не знаете, что делаете. Использование библиотеки, которая полагается на контекст внутри, относительно безопасно.

Еще одно важное замечание - React планирует использовать контекст больше, а не меньше в будущем. Мы считаем, что это может оказаться полезным для стилей, анимации, обработки жестов и т. Д. Dan Abramov
Реакт не удалит контекст. Я имею в виду, что это технически возможно, но единственная причина, по которой он существует, заключается в том, что в нем нуждались многочисленные продукты внутри FB. Поэтому, если нет эквивалентного решения, оно не исчезнет. Но его точный API может измениться, от чего мы защищаем пользователей. Dan Abramov
Хорошо сказал Дэн. Риск состоит в том, что если React полностью удалит контекст в будущем выпуске, вероятно, потребуется обновить его, чтобы обновить любое существующее приложение Redux. Redux вряд ли сможет защитить пользователей от таких изменений. Учитывая, что вы сейчас на Facebook, хорошей новостью является то, что я ожидаю, что у вас будет много предварительных уведомлений, если контекст когда-либо исчезнет. Cory House
Я не знаю, как другие, но я предпочитаю использовать декоратор соединений activ-redux, чтобы обернуть мои компоненты, чтобы в мой компонент передавались только реквизиты из нужного мне магазина. Это оправдывает использование контекста в некотором смысле, потому что Stanislav Mayorov
1

https://www.npmjs.com/package/redux-context-provider

Спасибо за ваше прекрасное руководство. На самом деле это очень легко.

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
Реагировать с Redux? А как насчет проблемы контекста? AmerllicA

Похожие вопросы