我注意到 React 只是浅层地冻结了 props,而 React.cloneElement 只是浅层地合并了 props。那么我们是否应该只在可能的情况下浅层传递 props 呢?
在 React 组件中仅浅层提供 props 是最佳实践吗?
IT技术
reactjs
2021-05-10 21:58:46
2个回答
你绝对可以在 props 中传递对象,我认为这根本不是一个坏习惯,尽管PropTypes
在你的组件上定义是个好主意,这样它的用户就知道要传递什么。
我还建议研究使您的模型不可变。不可变对象总是“冻结”的,而且它们还有其他好处,比如允许您以shouldComponentUpdate
非常有效的方式实现,简单地进行深度比较/深度克隆等。这种事情与react一起玩得非常好。
我会说尽可能让它们变浅,但总是这样做确实不可行,因为您必须假设您的数据非常平坦。最重要的是,react 允许您传递具有形状的对象,所以我认为传递和对象是可以的。
例如,看看下面的 Animal 对象。
{
name: 'Cow',
sound: 'Moo',
size: {
height: 50,
width: 200
},
origin : {
location: {
lat: 42.42,
lng: 83.02
},
name: 'Cow Land'
}
}
您可以决定制作一张可以放入物体的动物卡片。它可能具有包含大多数这些props的特定形状。
在卡片中,您可能想要使用大部分属性。但是,位置是一个嵌套对象,也可以用您拥有的位置组件来描述。
在某些时候,您的数据将不得不从某个地方进来。如果这个动物对象是一个更大的对象的一部分,那么通过在嵌套路径中打点来传递单个props会过于繁重,并且会使一个组件膨胀太多。
我建议清楚你的对象在组件链中的样子。组件应该是可组合的,所以我也想尽可能地分解事物。组件可以由处理嵌套数据结构的较小组件组成。从那里开始,保持单向数据流将有助于使您的数据不可变。
最终,使用您的判断力来决定何时应该传递原始值而不是具有形状的对象。
react示例显示了两者。
var ProductRow = React.createClass({
render: function() {
var name = this.props.product.stocked ?
this.props.product.name :
<span style={{color: 'red'}}>
{this.props.product.name}
</span>;
return (
<tr>
<td>{name}</td>
<td>{this.props.product.price}</td>
</tr>
);
}
});
在这个例子中,他们点在props上的产品上。所以这个组件正在接受一个产品对象,并假设它上面有什么。
祝你好运!