reactjs 为什么使用React Context比仅仅传递一个props对象更好?

db2dz4w8  于 2023-02-18  发布在  React
关注(0)|答案(3)|浏览(138)

我一直在阅读关于在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语法呢?当有很多东西可以吸收来做各种其他事情的时候,为什么要引入新的概念呢?

z3yyvxxp

z3yyvxxp1#

考虑大多数应用程序中相当常见的情况:你有身份验证信息(例如,当前用户),路由库(例如,react-router)和主题对象(使用什么颜色),这些都是分散在应用中的组件所需要的。
你想在组件树的顶端呈现一个按钮,它将显示用户的头像,所以它需要验证数据;它将在点击时导航,所以它需要路由库中的导航函数;它还需要根据主题设置自己的样式。
这当然可以通过props来实现,但是为了让按钮获得props,链中的每个组件也必须获得并转发这些props,这可能是很多组件的深度,比如页面组件-〉节组件-〉表-〉行-〉小部件-〉按钮,而大多数组件本身并不需要这些信息。所以他们只是拿着 prop 来沿着推进。
您可以轻松想象整个应用程序需要3个以上数据的情况。
有什么好吵的
大多数人觉得这种“ prop 钻取”很麻烦,但让我们假设你不这么认为。你仍然会遇到性能不佳的问题。如果每个组件都必须接收应用可能需要的全套“全局”值,那么任何时候发生任何变化,整个应用程序必须重新渲染。像react.memo这样的优化变得毫无用处。如果你只通过你需要的 prop ,你会得到好得多的表现。

vpfxa7rd

vpfxa7rd2#

更容易编辑代码(例如,您不必删除未使用的变量)更好的可重用性(您不会看到不必要的变量,并且您可以看到哪个组件正在使用变量)更少的性能浪费(防止使用不必要的变量)
假设你在中有10个后代--你必须通过10个组件传递一个变量。如果有些组件有相同的变量名呢?你必须编辑你传递的变量一段时间,然后再编辑回来。

i5desfxk

i5desfxk3#

总结如下:

  • 使用Context比将所有内容填充到单个对象变量中更高效,因为它避免了在发生任何更改时重新呈现整个应用。
  • 人们认为传递单个变量比引入特定语法更麻烦。
  • 上下文还允许您在应用程序的不同部分为同一个变量设置不同的值。如下所示(恕我直言,这是最佳解释):https://beta.reactjs.org/learn/passing-data-deeply-with-context
  • 上面的文章还指出,有时传递props是最好的解决方案,它给出了上下文的用例列表,以及每种情况下提供的优点。

相关问题