【发布时间】:2017-08-26 21:59:54
【问题描述】:
React 在 this page about performance 上讨论了您可以使用浅相等并避免改变对象,因此组件只需检查引用以查看 props 或 state 是否更改。
我实际上想知道相反的情况:是否可以让相等检查使用深度相等并在对象引用更改时忽略(只要它们的内容不更改)?
原因是,我有一个库,它返回一些内部变量的克隆版本,要查看这些变量的更新,我需要重新请求该内部变量,从而获得一个全新的克隆。因此,我将通过引用获得完全不同的对象,但它们可能不会更改任何字段。但是每次我请求这样的更新时,React 都会认为一切都发生了变化,因为所有的引用都发生了变化,并且它重新渲染了很多不必要的东西。
当前解决方案:只要对象的字段不改变,将其放入组件中以阻止其渲染
shouldComponentUpdate(nextProps, nextState) {
return !_.isEqual(this.props, nextProps) || !_.isEqual(this.state, nextState);
}
因为 lodash 的 isEqual 相等性检查很深,所以这可以解决问题,但我必须在每个想要这种行为的组件上这样做。我想知道是否有一个
- 实现此目的的首选方式
- 我使用的一种反模式首先导致了这种情况,我可以完全避免它
或者也许上面的方法是最好的。
【问题讨论】:
-
如果您希望这是一组组件的默认行为,也许您可以扩展
React.Component并像这样覆盖shouldComponentUpdate。所以也许有类似class DeepEqualityComponent extends React.Component的东西,然后从DeepEqualityComponent扩展
标签: javascript reactjs lodash