首页 文章

与Redux反应? 'context'问题怎么样?

提问于
浏览
80

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

似乎有很多人主张使用Redux和React来管理数据/状态,但是在阅读和学习两者时,我遇到了一些看起来不太合适的东西 .

Redux

在本页底部:http://redux.js.org/docs/basics/UsageWithReact.html(传递商店)它建议使用React 'Context'的"Magic" .

一种选择是将其作为道具传递给每个容器组件 . 然而,它变得乏味,因为你必须通过表示组件进行连线存储,因为它们碰巧在组件树中深层渲染容器 . 我们推荐的选项是使用一个特殊的React Redux组件来调用,以神奇地使商店可用于所有容器组件......

反应

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

上下文是一种先进的实验性功能 . API可能会在将来的版本中发生变化 .

然后在底部:

正如在编写清晰代码时最好避免全局变量一样,在大多数情况下应避免使用上下文...不要使用上下文通过组件传递模型数据 . 明确地通过树线程处理数据更容易理解......

所以......

Redux建议使用React 'Context'功能,而不是通过'props'将 store 向下传递给每个组件 . 虽然React建议相反 .

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

  • 我读了这一切吗?

  • 目前关于这个问题的一般共识是什么?

3 回答

  • 4

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

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

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

    最终React Redux仍然支持将商店作为道具传递,所以如果你想完全避开上下文,你就有了这个选择 . 不过我会说这是不切实际的 .

    TLDR: Avoid using context directly unless you really know what you are doing. Using a library that happens to rely on context internally is relatively safe.

  • 82

    我没有't know about others, but I prefer using react-redux'的连接装饰器来包装我的组件,以便只有我需要的商店的道具传递到我的组件 . 这在某种意义上证明了上下文的使用是正确的,因为我没有使用它(我知道,通常,我负责的任何代码都不会消耗它) .

    当我测试我的组件时,我测试了非包装组件 . 因为react-redux只传递了我在该组件上所需的道具,所以我现在确切知道在编写测试时我需要什么道具 .

    我想重点是,我在代码中看不到单词context,我不会消耗它,所以在某种程度上,它不会影响我!这并没有说明Facebook的“实验性”警告 . 如果上下文消失了,我会像其他人一样紧张,直到Redux更新 .

  • 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>
        );
      }
    }
    

相关问题