跳到主要内容

shouldComponentUpdate

2024年03月06日
柏拉文
越努力,越幸运

一、认识


shouldComponentUpdate 用于告知组件本身基于当前的 propsstate 是否需要重新渲染组件,默认情况返回true执行时机: 到新的props或者state时都会调用,通过返回true或者false告知组件更新与否。一般情况,不建议在该周期方法中进行深层比较,会影响效率, 同时也不能调用 setState,否则会导致无限循环调用更新。需要重点关注的是第二个参数 newState ,如果有 getDerivedStateFromProps 生命周期 ,它的返回值将合并到 newState ,供 shouldComponentUpdate 使用。

二、语法


shouldComponentUpdate(newProps,newState){
if(newProps.a !== this.props.a ){ /* props中a属性发生变化 渲染组件 */
return true
}else if(newState.b !== this.props.b ){ /* state 中b属性发生变化 渲染组件 */
return true
}else{ /* 否则组件不渲染 */
return false
}
}

三、场景


3.1 比较基础数据,控制渲染

比较基础数据,控制渲染: 可以直接比较前后数据是否相等

import React, { Component } from "react";
import ReactDOM from "react-dom";

class App extends Component {
constructor(props) {
super(props);
this.state = {
num: 0,
};
}
handleClick() {
this.setState({
num: this.state.num + 1,
});
}

shouldComponentUpdate(newProps, newState) {
if (newState.num !== this.state.num) {
return true;
}
return false;
}

render() {
const { num } = this.state;
return (
<div>
<h3>App 组件</h3>
{num}
<button onClick={() => this.handleClick()}>改变</button>
</div>
);
}
}

ReactDOM.render(<App />, document.getElementById("root"));

3.2 比较引用数据,控制渲染

比较引用数据,控制渲染: 不可以直接比较是否相等,需要借助 immutable.js 来对比

import React, { Component } from "react";
import ReactDOM from "react-dom";
import Immutable from "immutable";

class App extends Component {
constructor(props) {
super(props);
this.state = {
like: Immutable.Map({ a: 1, b: 2, c: 3 }),
};
}
handleClick() {
this.setState({
like: Immutable.Map({ a: 2, b: 2, c: 3 }),
});
}

shouldComponentUpdate(newProps, newState) {
if (Immutable.is(newState.like,this.state.like)) {
console.log('kk')
return true;
}
return false;
}

render() {
const { like } = this.state;
return (
<div>
<h3>App 组件</h3>
{like.get('a')}
<button onClick={() => this.handleClick()}>改变</button>
</div>
);
}
}

ReactDOM.render(<App />, document.getElementById("root"));