看了很多文章都说的不清楚,有的直接是错误的。
我这就简单说一下:
1. 当你的state里面的属性有引用对象(对象、数组等)时,你通过某一个动作(比如点击事件)去修改这个值,但是没有修改它的引用。这种情况我们的render()方法是不会执行的。如下当我点击按钮的时候是没有任何输出的,因为render没有重新渲染。
export default class PageB extends React.PureComponent {
state = {
items: [],
};
handleClick = () => {
const { items } = this.state;
items.push("1231");
this.setState({ items });
};
render() {
console.log(this.state.items);
return (
<div>
<button onClick={this.handleClick}>点我</button>
</div>
);
}
}
2. 当我们如下修改一下handleClick,items值就会输出,render就会重新渲染。因为items的引用变了,我们新建了一个数组。
handleClick = () => {
const { items } = this.state;
items.push("1231");
this.setState({ items: [...items] });
};
3. 对象也是一样的。若是继承的PureComponent,你给state里面对象属性新增属性或者删除属性,render都不会重新渲染,如下:
state = {obj: {}};
handleClick = () => {
const { obj } = this.state;
obj.a = "234";
this.setState({ obj });
};
4.但是state里存放的是基本类型(数字,字符串,布尔等)则不会出现上述问题,每次修改时render都会加载渲染页面的。
原因就是React.PureComponent 的 shouldComponentUpdate() 只会对对象进行浅对比
5.结论:故只要注意以上问题,就可以使用PureComponent来代替Component进行项目优化,减少不必要的 render操作的次数,从而提高界面的渲染性能。