在 React 组件中仅浅层提供 props 是最佳实践吗?

IT技术 reactjs
2021-05-10 21:58:46

我注意到 React 只是浅层地冻结了 props,而 React.cloneElement 只是浅层地合并了 props。那么我们是否应该只在可能的情况下浅层传递 props 呢?

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上的产品上。所以这个组件正在接受一个产品对象,并假设它上面有什么。

祝你好运!