与Redux反应? “背景”问题怎么样?

时间:2016-04-05 13:51:55

标签: javascript reactjs redux

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

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

Redux的

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

  

一种选择是将其作为道具传递给每个容器组件。然而,它变得乏味,因为你必须通过表示组件连线存储,因为它们碰巧在组件树中深层渲染容器。

     

我们推荐的选项是使用一个特殊的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 个答案:

答案 0 :(得分:83)

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

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

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

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

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

答案 1 :(得分:4)

我不了解其他人,但我更喜欢使用react-redux的连接装饰器来包装我的组件,以便只将我需要的商店中的道具传递到我的组件中。这在某种意义上证明了上下文的使用是正确的,因为没有消耗它(我知道,通常,我负责的任何代码都不会消耗它)。

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

我想重点是,我没有在代码中看到上下文这个词,我不会消费它,所以在某种程度上,它并没有影响我!这并没有说明关于Facebook"实验"警告..如果上下文消失了,在Redux更新之前,我和其他人一样紧张。

答案 2 :(得分:1)

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

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

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

import cmd

number_users = 4
number_rounds = 10  # or whatever
user_names = [None]*number_users
user_scores = [None]*number_users

for i in range(number_users):
    print("Enter name for user #{}: ".format(i+1))
    user_names[i] = input()
    user_scores[i] = 100

for round_number in range(number_rounds):
    print(" --- ROUND {} ---".format(round_number+1))
    for i in range(number_users):
        print("{}, Enter your score: ".format(user_names[i]))
        user_scores[i] = input()
    print("--- Scores for Round {} ---".format(round_number+1))
    for i in range(number_users):
        print("{} : {}".format(user_names[i], user_scores[i]))

print("Done")