class Sub extends React.Component {
render() {
console.log('sub render');
return (
<div>
sub
</div>
)
}
}
class App extends React.Component {
state = {
count: 0
}
onClick = () => {
this.setState({
count: this.state.count + 1
});
}
render() {
console.log('render');
const {count} = this.state;
return (
<div>
<Sub name='zhangsan' />
<p>{count}</p>
<button onClick={this.onClick}>button</button>
</div>
)
}
}
ReactDOM.render(<App />, document.getElmenetById('root'));
父组件更新,会重新渲染。子组件虽然没有什么更新,但是也会被重新渲染。
更新的特性:父组件的更新会导致子组件的更新
优化点:如果子组件没有状态的更新,即使父组件更新,重新渲染。子组件也不需要重新渲染。
shouldComponentUpdate
利用这个 shouldComponentUpdate 的生命周期钩子函数,但目前已经不常用
sholdComponentUpdate(nextProps, nextStates)
有两个参数
- 下次更新 props
- 下次更新 state
返回一个 boolean
- true 更新
false 不更新
class Sub extends React.Component {
shouldCompnentUpdate(nextProps, nextState) {
console.log(nextProps.name, this.props.name);
return nextProps.name !== this.props.name
}
render() {
console.log('sub render');
return (
<div>
sub
</div>
)
}
}
PureComponent
不用手写 shouldComponentUpdate,React.PureComponent 以浅层对比 prop 和 state 的方式来实现 shouldComponentUpdate()
class Sub extends React.PureComponent {
render() {
console.log('sub render');
return (
<div>
sub
</div>
)
}
}
注意 Props 每次都生成一个新值的话 React.PureComponent 是起不了作用
class App extends React.Component {
state = {
count: 0
}
onClick = () => {
this.setState({
count: this.state.count + 1
});
}
callback = () => {
}
render() {
console.log('render');
const {count} = this.state;
return (
<div>
<Sub cb={() => this.callback()} />
<p>{count}</p>
<button onClick={this.onClick}>button</button>
</div>
)
}
}
18 行,每次都是
() => this.callback()
一个新的函数,PureCompoment 就没效了。
改为直接使用 class fieldclass App extends React.Component {
state = {
count: 0
}
onClick = () => {
this.setState({
count: this.state.count + 1
});
}
callback = () => {
}
render() {
console.log('render');
const {count} = this.state;
return (
<div>
<Sub cb={this.callback} />
<p>{count}</p>
<button onClick={this.onClick}>button</button>
</div>
)
}
}
memo
memo hooks 用于函数组件,起到与类组件 PureComponent 一样的效果
const Sub = React.memo((params) => {
console.log('sub render');
return (
<div>
sub
</div>
)
});