1. class Sub extends React.Component {
  2. render() {
  3. console.log('sub render');
  4. return (
  5. <div>
  6. sub
  7. </div>
  8. )
  9. }
  10. }
  11. class App extends React.Component {
  12. state = {
  13. count: 0
  14. }
  15. onClick = () => {
  16. this.setState({
  17. count: this.state.count + 1
  18. });
  19. }
  20. render() {
  21. console.log('render');
  22. const {count} = this.state;
  23. return (
  24. <div>
  25. <Sub name='zhangsan' />
  26. <p>{count}</p>
  27. <button onClick={this.onClick}>button</button>
  28. </div>
  29. )
  30. }
  31. }
  32. ReactDOM.render(<App />, document.getElmenetById('root'));

父组件更新,会重新渲染。子组件虽然没有什么更新,但是也会被重新渲染。
更新的特性:父组件的更新会导致子组件的更新

优化点:如果子组件没有状态的更新,即使父组件更新,重新渲染。子组件也不需要重新渲染。

shouldComponentUpdate

利用这个 shouldComponentUpdate 的生命周期钩子函数,但目前已经不常用
sholdComponentUpdate(nextProps, nextStates)
有两个参数

  • 下次更新 props
  • 下次更新 state

返回一个 boolean

  • true 更新
  • false 不更新

    1. class Sub extends React.Component {
    2. shouldCompnentUpdate(nextProps, nextState) {
    3. console.log(nextProps.name, this.props.name);
    4. return nextProps.name !== this.props.name
    5. }
    6. render() {
    7. console.log('sub render');
    8. return (
    9. <div>
    10. sub
    11. </div>
    12. )
    13. }
    14. }

    PureComponent

    不用手写 shouldComponentUpdate,React.PureComponent 以浅层对比 prop 和 state 的方式来实现 shouldComponentUpdate()

    1. class Sub extends React.PureComponent {
    2. render() {
    3. console.log('sub render');
    4. return (
    5. <div>
    6. sub
    7. </div>
    8. )
    9. }
    10. }

    注意 Props 每次都生成一个新值的话 React.PureComponent 是起不了作用

    1. class App extends React.Component {
    2. state = {
    3. count: 0
    4. }
    5. onClick = () => {
    6. this.setState({
    7. count: this.state.count + 1
    8. });
    9. }
    10. callback = () => {
    11. }
    12. render() {
    13. console.log('render');
    14. const {count} = this.state;
    15. return (
    16. <div>
    17. <Sub cb={() => this.callback()} />
    18. <p>{count}</p>
    19. <button onClick={this.onClick}>button</button>
    20. </div>
    21. )
    22. }
    23. }

    18 行,每次都是 () => this.callback() 一个新的函数,PureCompoment 就没效了。
    改为直接使用 class field

    1. class App extends React.Component {
    2. state = {
    3. count: 0
    4. }
    5. onClick = () => {
    6. this.setState({
    7. count: this.state.count + 1
    8. });
    9. }
    10. callback = () => {
    11. }
    12. render() {
    13. console.log('render');
    14. const {count} = this.state;
    15. return (
    16. <div>
    17. <Sub cb={this.callback} />
    18. <p>{count}</p>
    19. <button onClick={this.onClick}>button</button>
    20. </div>
    21. )
    22. }
    23. }

    memo

    memo hooks 用于函数组件,起到与类组件 PureComponent 一样的效果

    1. const Sub = React.memo((params) => {
    2. console.log('sub render');
    3. return (
    4. <div>
    5. sub
    6. </div>
    7. )
    8. });