Реагировать с Redux? Как насчет проблемы "контекста"?

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

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

Redux

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

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

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

Реагировать

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

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

Затем внизу:

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

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

Так...

Redux рекомендует использовать функцию "Контекст", а не передавать store вдоль каждого компонента через "реквизит". Хотя React рекомендует противоположное.

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

  • Я читаю все это правильно..?
  • Каков общий текущий консенсус по этому вопросу??

Ответ 1

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

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

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

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

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

Ответ 2

Я не знаю о других, но я предпочитаю использовать декоратор-декодер link-redux для переноса моих компонентов, чтобы только реквизит из магазина, в котором я нуждался, передавался в мой компонент. Это оправдывает использование контекста в определенном смысле, потому что я его не потребляю (и я знаю, как правило, любой код, который я возглавляю, не будет его потреблять).

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

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