React props:我应该传递对象还是它的属性?它有很大的不同吗?

IT技术 javascript reactjs react-props
2021-04-21 13:46:17

传递 props 时,我应该将整个对象传递给子组件,还是应该首先在父组件中单独创建 props,然后将这些 props 传递给子组件?

传递整个对象:

<InnerComponent object={object} />

单独创建首先需要的props:

<InnerComponent name={object.name} image={object.image} />

哪个是首选,如果取决于,我应该使用什么作为衡量标准?

6个回答

根据最小权限原则,这是一个正确的方法:

<InnerComponent name={object.name} image={object.image} />

这限制InnerComponent了意外修改原始对象或访问不适合它的属性。

或者,可以从原始对象中选取属性并作为props传递:

<InnerComponent {...pick(object, 'name', 'image')} />

如果有许多难以列出的属性,那么可能只有一个 prop 接受一个对象:

<InnerComponent object={pick(object, 'name', 'image')} />
可能很高兴添加该 pick 是 lodash 的一个函数。由于在 JS 中生成对象的子集非常简单,当您想要 { name: name } 之类的东西时,可以省略 pick() 并简单地使用 {name, image},我猜...
2021-06-03 13:46:17
@Xen_mar Lodash 是一个值得注意的例子,但它是任意挑选功能,可以是用户定义的单线,pick = (o, ...keys) => Object.fromEntries(Object.entries(o).filter(([k]) => keys.includes(k))). let {name, image} = object由于 JSX 通常是如何编写的,解构需要在上面这并不总是实用的,它可能是一个没有return.
2021-06-07 13:46:17

你应该更喜欢你的第二个例子,单独传递props。在那里,您可以明确地看到传递了哪些参数,并可以快速与预期的参数进行比较。这使得人们之间的协作更加容易,并使应用程序的状态更加清晰。

如果不需要,我个人会尽量避免传递整个对象。这就像扩展运算符,其中可以有任何属性,并且在更大的范围内调试要困难得多。

对纯 react 的一些添加,例如prop-typestypescript可能有助于在大型应用程序中定义清晰和预期的属性

所以这是一个可维护性的问题?React 是否因传递对象而不是属性而遭受任何明显的开销?
2021-06-20 13:46:17

由于 JavaScript 没有类型注释,因此第二个选择会更可取,正如@mstruebing 所述,代码将更易于维护。但是,如果您使用的是 TypeScript React(支持类型注释),那么两种选择都将同样清晰。但请记住,第一个选择促进了视图和模型之间的紧密耦合,这允许快速开发,因为您不必输入太多;虽然第二个选择可能会减慢开发速度,但您对未来的变化有更高的灵活性和容忍度。

所以,衡量标准是:如果你更喜欢开发速度而不是灵活性,那么选择 1;如果您更喜欢灵活性而不是开发速度,请选择选项 2。

附加说明

好的,我们什么时候应该优先考虑开发速度而不是灵活性?这是我的 2 美分。

如果您的项目是为了短期使用(例如开发一个仅用于在选举期间收集选票的应用程序),那么请选择第一选择。

如果您的项目旨在长期使用(例如在线银行交易门户),您应该选择第二个。

另外我的2美分:根据经验,我认为这是值得一般花时间去选择2,因为它不是超过选择题1.你可以节省的大量时间你会发现你的应用程序的日子不再短期使用(它几乎总是这样结束)
2021-05-22 13:46:17

将多个 props 传递给子组件是将 props 传递给子组件的首选方式。这将帮助您跟踪子组件中应用程序的状态。此外,请随意使用该prop-typesmodule。它的作用类似于 Java 中的泛型,并为传入的 props 提供类型安全性。

如果您没有使用对象中的所有属性,最好单独传递所需的属性,因为当Child组件PureComponent处于使用状态时它可以帮助性能优化shouldComponentUpdate在这种情况下,只有当Child组件使用的 props发生变化时,它才会重新渲染,而不会在对象中未使用的属性发生变化时重新渲染。

但是,如果您正在使用对象中的所有属性,那么如果您将对象作为props传递,只要您正确处理了对象的突变,就不会产生太大的不同事件。

如果我们传递一个对象,重新渲染将仅取决于整个对象何时发生变化,而不取决于单个属性
2021-06-07 13:46:17