我通常会在Stack上发布与代码相关的内容,但这更像是关于社区的一般想法的问题。
似乎有很多人主张使用Redux和React来管理数据/状态,但是在阅读和学习这些内容时,我遇到了一些看起来不太合适的东西。
在本页底部: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的创建者)工作,只是为了让我更加困惑。
答案 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")