与Redux有反应吗?那么“上下文”问题呢?


88

我通常在Stack上发布与代码相关的内容,但这更多是关于社区的一般思想的问题。

似乎有很多人主张将Redux与React结合使用来管理数据/状态,但是在阅读和学习两者的过程中,我遇到了一些看起来不太正确的事情。

Redux

在此页面底部:http : //redux.js.org/docs/basics/UsageWithReact.html(通过商店),建议您使用React“上下文”的“魔术”。

一种选择是将其作为道具传递给每个容器组件。但是,这很繁琐,因为您甚至必须通过演示组件来进行存储,因为它们恰好在组件树中渲染了一个容器。

我们建议的选项是使用特殊的React Redux组件,以神奇方式使商店可用于所有容器组件...

反应

在React Context页面(https://facebook.github.io/react/docs/context.html)上,它在顶部有一个警告:

上下文是一项先进的实验功能。该API可能会在将来的版本中更改。

然后在底部:

正如在编写清晰的代码时最好避免使用全局变量一样,在大多数情况下,您应该避免使用上下文...

不要使用上下文来通过组件传递模型数据。显式地将数据线程穿过树很容易理解...

所以...

Redux建议使用React的“上下文”功能,而不是store通过“ props” 将其传递给每个组件。而React建议相反。

而且,似乎Dan Abramov(Redux的创建者)现在为Facebook(React的创建者)工作,只是让我更加困惑。

  • 我可以阅读所有这些吗?
  • 当前在这个问题上的普遍共识是什么?

8
啊,这是一个很好的问题,我很好奇也听到了其他人的观点!由于讨论方面的原因,我有点担心它会关闭。我真的希望不会。
mjohnsonengr '16

Answers:


88

上下文是一项高级功能,随时可能更改。在某些情况下,它的便利性大于缺点,因此尽管有实验性质,诸如React Redux和React Router之类的某些库还是选择依赖它。

这里的重要部分是单词。如果上下文改变了它的行为,我们作为图书馆作者将需要进行调整。但是,只要库不要求您直接使用上下文API,您(作为用户)就不必担心对其进行更改。

React Redux在内部使用上下文,但未在公共API中公开这一事实。因此,通过React Redux使用上下文比直接使用上下文要安全得多,因为如果上下文发生更改,更新代码的负担将落在React Redux上,而不是您。

最终,React Redux仍然支持始终传递存储作为道具,因此,如果您要完全避免上下文,则可以选择。但是我会说这是不切实际的。

TLDR:除非您真的知道自己在做什么,否则请避免直接使用上下文。使用恰好在内部依赖上下文的库相对安全。


1
好吧,丹。风险是,如果React在将来的版本中完全删除上下文,则可能需要重新工作以更新任何现有的Redux应用程序。Redux不太可能能够保护用户免受此类更改。鉴于您现在在使用Facebook,好消息是,我希望您能在上下文消失的情况下提前通知您。
Cory House

6
React不会删除上下文。我的意思是,从技术上讲这是可能的,但是存在的全部原因是因为FB内部的许多产品都需要它。因此,除非有等效的解决方案,否则它不会消失。但是其确切的API可能会发生变化,这是我们屏蔽用户的对象。
Dan Abramov

5
另一个重要的注意事项是React计划在将来更多而不是更少使用上下文。我们认为这可能成为一种造型,动画,手势操控等有用
丹·阿布拉莫夫

但是,有趣的是,当您获得React组件库(例如Material-ui)时,它们自然不会构成您的应用程序状态模型的一部分,但是仍然是一堆React组件,它们具有相同的要求保持自己的状态模型和数据流与“主”应用程序分开。因此,他们将上下文功能用作(向他们)将数据向下传递给他们的孩子的唯一手段。
stephenwil '16

1
@DanAbramov新的上下文API呢?还是不建议使用?
斯坦尼斯拉夫·马约洛夫'18

4

我对其他人一无所知,但我更喜欢使用react-redux的connect装饰器包装我的组件,以便仅将我需要的商店中的道具传递到我的组件中。从某种意义上说,这证明了使用上下文是合理的,因为没有使用它(而且我通常知道,我负责的任何代码都不会使用它)。

测试组件时,我将测试未包装的组件。因为react-redux仅通过了我在该组件上需要的道具,所以我现在确切地知道在编写测试时需要哪些道具。

我想要说的是,我从没在代码中看到单词上下文,没有使用它,因此在某种程度上,它不会影响我!这并没有说明Facebook的“实验性”警告。如果上下文消失,在Redux更新之前,我将像其他所有人一样陷入困境。


有趣的是……我明白了您对“ react-redux”的使用Provider以及connect对所有Context内容的抽象化。我猜想丹·阿布拉莫夫现在就在FB上,您希望如果Context更改Redux并且'react-redux'会被更新...但是虽然不能保证,但是FB的“实验”警告仍然在那里有目共睹。
史蒂芬·

我当然希望,如果FB不会在上下文中发生任何事情的情况下将react-redux保留在循环中,那么开源贡献者将比我更熟悉redux。如果没有,我会自己解决的!
mjohnsonengr '16

我通过Twitter向Dan询问了他的想法。同样的回答,很好的答案。请使用使用Context的库,不要直接使用它。
史蒂芬·

1

有一个npm模块,可以很容易地将redux添加到react上下文

https://github.com/jamrizzi/redux-context-provider

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>
    );
  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.