【发布时间】:2019-11-21 17:05:56
【问题描述】:
我们使用 ReactJS 创建了一个可重用的列表组件。然而,由于性能问题,我们决定实现 - shouldComponentUpdate 方法,条件是我的列表组件何时呈现
public shouldComponentUpdate(nextProps: TreeItemInternalProps, nextState: {}): boolean {
if (this.props.treeObject.selected !== nextProps.treeObject.selected) {
return true;
}
if (this.props.treeObject.expanded !== nextProps.treeObject.expanded) {
return true;
}
return false;
}
意思是,我只想在列表项复选框的值发生变化时渲染我的组件。
假设由于某种原因,我不能再这样做了。现在,我的替代方案是使用 PureComponent 进行浅比较。因此,它应该只呈现更改的列表项。但是,即使在使用 PureComponent 之后使用,整个组件也会被渲染。
要正确解释该场景,请参阅以下屏幕截图 -
- 不使用 PureComponent / 在 shouldComponentUpdate 中使用条件检查
这里可以看到“组件被渲染”的日志只调用了一次,意思是只针对我在prop中做的改变(这个需求是一样的,我想用PureComponent来实现)
- 使用 PureComponent
在这里,您可以看到日志“组件已渲染”被调用了 3 次,即使我只更改了第一个列表项的 props。这是使用 PureComponent
【问题讨论】:
-
PureComponent 对您的道具进行
shallow检查,以进行深入比较,您可能需要拥有生命周期。阅读:medium.com/@baphemot/… -
你能分享一些你的代码吗?
-
如果我理解正确的话,PureComponent 只会在 props 或 state 发生任何变化时渲染。然而,只有 React.Component 每秒渲染一次。 @Nicolae Maties
-
是的,这是真的。您正在更改 parent 或 state 中的道具。您需要共享组件及其父组件的代码,以便我们为您提供帮助。或者创建一个代码框以在没有您的确切代码的情况下重现问题。
-
@Domino987 给我一些时间,我将返回代码或者如果我能够设置沙箱
标签: javascript reactjs typescript