# 此页面贡献者:树

React一些数据变化导致会让组件所有的全部渲染,用什么来解决

啥时候会重新渲染一个子组件?

当子组件的 shouldComponentUpdate() 的返回值为 true 时。而 shouldComponentUpdate() 的返回值默认为 true,所以嗦,如果子组件都没有做什么特别的处理,是一些特别普通的 Component 的话,父组件更新时就会更新所有的子组件。

咋避免?

Option 1

你可以给你的子组件加上 shouldComponentUpdate() 方法,例如:

class Messy extends Component {
    // ...
    shouldComponentUpdate (newProps, newState) {
        return newProps.val !== this.props.val;
    }
    // ...
}

Option 2

还可以继承 React 自带的 PureComponent 类。

文档里是这么说的:

React.PureComponent is exactly like React.Component but implements shouldComponentUpdate() with a shallow prop and state comparison. If your React component’s render() function renders the same result given the same props and state, you can use React.PureComponent for a performance boost in some cases.

于是乎只要这样就可以了:

import { PureComponent } from 'react';
class Messy extends PureComponent {
    // ...
}

需要注意的是,PureComponent 进行的是浅比较,如果你的数据包含复杂的数据结构,那么可能就不太对了。如果有深层次的数据改变,你可以手动 forceUpdate() 或是使用 immutable objects

参考

React: Parent component re-renders all children, even those that haven't changed on state change

上次更新: 7/29/2018, 12:21:27 PM