我一直在阅读关于在React中使用Context的优势的文章,但我并不信服,我想知道我是否遗漏了什么。
Context提供了一种通过组件树传递数据的方法,而不必在每个级别手动向下传递属性。
在主组件中创建一个props对象并在下属之间传递它有什么麻烦吗?
// do this once at top level (I'm assuming [foo, foo_set] and [bar, bar_set] are state variables):
const props = {foo, foo_set, bar, bar_set, thisAndThat, theOther, whatever, etcAndEtc}
// including one component
<MyComponent1 {...props } />
// including another
<MyComponent2 {...props } />
(也许对这个对象使用另一个名称比props更好,因为组件可以有其他属性。无论如何。)
然后在MyComponent1中,您可以访问所有想要的 prop ,或者不访问它们。
...
const MyComponent1 = (props) => {
...
// here we can use any props we need, props.bar, props.bar_set, props.theOther for example
const localVar = props.bar * 2;
props.bar_set(localVar);
// this changes the value of bar throughout the app
...
}
在我看来,上述方法的优点在于,您可以将props对象传递给其他子子组件,而不必担心是否缺少任何内容。或者:
...
const MyComponent1 = ({bar, bar_set, theOther }) => {
...
// here we can use bar, bar_set, theOther in the same example
const localVar = bar * 2;
bar_set(localVar);
...
}
此选项的优点是语法较短。
所以我的观点是为什么不直接使用标准的JavaScript语法呢?当有很多东西可以吸收来做各种其他事情的时候,为什么要引入新的概念呢?
3条答案
按热度按时间z3yyvxxp1#
考虑大多数应用程序中相当常见的情况:你有身份验证信息(例如,当前用户),路由库(例如,react-router)和主题对象(使用什么颜色),这些都是分散在应用中的组件所需要的。
你想在组件树的顶端呈现一个按钮,它将显示用户的头像,所以它需要验证数据;它将在点击时导航,所以它需要路由库中的导航函数;它还需要根据主题设置自己的样式。
这当然可以通过props来实现,但是为了让按钮获得props,链中的每个组件也必须获得并转发这些props,这可能是很多组件的深度,比如页面组件-〉节组件-〉表-〉行-〉小部件-〉按钮,而大多数组件本身并不需要这些信息。所以他们只是拿着 prop 来沿着推进。
您可以轻松想象整个应用程序需要3个以上数据的情况。
有什么好吵的
大多数人觉得这种“ prop 钻取”很麻烦,但让我们假设你不这么认为。你仍然会遇到性能不佳的问题。如果每个组件都必须接收应用可能需要的全套“全局”值,那么任何时候发生任何变化,整个应用程序必须重新渲染。像react.memo这样的优化变得毫无用处。如果你只通过你需要的 prop ,你会得到好得多的表现。
vpfxa7rd2#
更容易编辑代码(例如,您不必删除未使用的变量)更好的可重用性(您不会看到不必要的变量,并且您可以看到哪个组件正在使用变量)更少的性能浪费(防止使用不必要的变量)
假设你在中有10个后代--你必须通过10个组件传递一个变量。如果有些组件有相同的变量名呢?你必须编辑你传递的变量一段时间,然后再编辑回来。
i5desfxk3#
总结如下: