与 Redux react?“上下文”问题呢?

IT技术 javascript reactjs redux
2021-03-06 14:17:37

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

似乎有很多人提倡使用 Redux 和 React 来管理数据/状态,但是在阅读和学习两者时,我发现了一些不太正确的东西。

终极版

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

一种选择是将其作为props传递给每个容器组件。然而它变得乏味,因为你甚至必须通过展示组件来连接存储,因为它们恰好在组件树的深处呈现一个容器。

我们推荐的选项是使用一个特殊的 React Redux 组件,它被称为神奇地使存储可用于所有容器组件......

react

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

上下文是一项高级和实验性的功能。API 可能会在未来版本中更改。

然后在底部:

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

不要使用上下文通过组件传递模型数据。明确地将数据穿过树更容易理解......

所以...

Redux 建议使用 React 'Context' 特性,而不是store通过 'props' 向下传递给每个组件。而 React 建议相反。

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

  • 我读得对吗..?
  • 目前对这个问题的普遍共识是什么?
3个回答

上下文是一项高级功能,可能会发生变化。在某些情况下,它的便利性超过了它的缺点,因此一些库,如 React Redux 和 React Router,尽管具有实验性质,但还是选择依赖它。

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

React Redux 在内部使用上下文,但它没有在公共 API 中公开这个事实。所以你应该觉得通过 React Redux 使用上下文比直接使用上下文要安全得多,因为如果它发生变化,更新代码的负担将落在 React Redux 而不是你身上。

最终 React Redux 仍然支持始终将 store 作为 prop 传递,所以如果你想完全避免上下文,你可以选择。但是我会说这是不切实际的。

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

@DanAbramov 新的上下文 API 怎么样?还是不推荐使用?
2021-04-28 14:17:37
丹说得好。风险是,如果 React 在未来版本中完全删除上下文,则可能需要返工以更新任何现有的 Redux 应用程序。Redux 不太可能保护用户免受此类更改的影响。鉴于您现在使用 Facebook,好消息是,如果上下文消失,我希望您能提前收到很多通知。
2021-04-30 14:17:37
然而,有趣的是,当您获得 React 组件库(例如 Material-ui)时,它们自然不会构成您的应用程序状态模型的一部分,但仍然是一棵相同的 React 组件树,具有相同的要求维护自己的状态模型和数据流与“主”应用程序分开。因此,他们将上下文功能用作(对他们而言)将数据向下传递给其子层次结构的唯一手段。
2021-05-05 14:17:37
React 不会删除上下文。我的意思是,这在技术上是可行的,但它存在的全部原因是因为 FB 内部的许多产品都需要它。因此,除非有等效的解决方案,否则它不会消失。但它的确切 API 可能会改变,这是我们屏蔽用户的原因。
2021-05-07 14:17:37
另一个重要的注意事项是 React 计划在未来更多地而不是更少地使用上下文。我们认为它可能对样式、动画、手势处理等有用。
2021-05-18 14:17:37

我不知道其他人,但我更喜欢使用 react-redux 的连接装饰器来包装我的组件,以便只有我需要的商店中的props才能传递到我的组件中。这在某种意义上证明了使用上下文是合理的,因为没有使用它(而且我知道,作为一项规则,我负责的任何代码都不会使用它)。

当我测试我的组件时,我会测试未包装的组件。因为 react-redux 只传递了我在那个组件上需要的 props,所以我现在在编写测试时确切地知道我需要什么 props。

我想重点是,我从来没有在我的代码中看到过上下文这个词,我不使用它,所以在某种程度上,它不会影响我!这并没有说明 Facebook 的“实验性”警告。如果上下文消失了,在 Redux 更新之前,我会和其他人一样被搞砸。

我当然希望如果 FB 不将 react-redux 保留在循环中以防上下文发生任何事情,那么在某个地方比我更熟悉 redux 的开源贡献者会这样做;如果没有,我会想办法自己做!
2021-05-07 14:17:37
我通过 Twitter 向 Dan 询问了他的想法......很好的答案,沿着相同的思路......使用使用 Context 的库,不要直接使用它。
2021-05-17 14:17:37
有趣...我明白你所说的“react-redux”使用Providerconnect抽象出所有上下文的意思。我想 Dan Abramov 现在在 FB 你会希望如果 Context 改变了 Redux 并且'react-redux' 会被更新......但不能保证,而且 FB 的“实验性”警告仍然有目共睹。
2021-05-18 14:17:37

有一个 npm module可以很容易地将 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>
    );
  }
}