欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

React优化子组件render的使用

程序员文章站 2023-12-04 19:49:34
在react中,父组件的重新render会引发子组件的重新render,但是一些情况下我们会觉得这样做有些多余,比如: 父组件并未传递props给子组件 新...

在react中,父组件的重新render会引发子组件的重新render,但是一些情况下我们会觉得这样做有些多余,比如:

  1. 父组件并未传递props给子组件
  2. 新传递的props渲染结果不变
class a extends react.component {
  render() {
    console.log('render')
    return <div>这是a组件</div>
  }
}

class main extends react.component {
  render() {
    return (
      <div>
        // 点击button会让a不断调用render
        <button onclick={() => this.setstate({ a: 1 })}>main</button>
        <a />
      </div>
    )
  }
}

为了解决这个问题,需要分为es6类组件和函数式组件两种:

类组件

使用shouldcomponentupdate来对props和state进行判断以此决定是否进行render

class a extends react.component {
  shouldcomponentupdate(nextprops, nextstate) {
    //两次props对比
    return nextprops.a === this.props.a ? false : true
  }
  render() {
    console.log('render')
    return <div>这是a组件</div>
  }
}

class main extends react.component {
  // ...
  render() {
    return (
      <div>
        <button onclick={() => this.setstate({ a: 1 })}>main</button>
        <a a={this.state.a} />
      </div>
    )
  }
}

通过返回false来跳过这次更新

使用react.purecomponent,它与react.component区别在于它已经内置了shouldcomponentupdate来对props和state进行浅对比,并跳过更新

//purecomponent
class a extends react.purecomponent {
  render() {
    console.log('render')
    return <div>这是a组件</div>
  }
}

class main extends react.component {
  state = {
    a: 1
  }
  render() {
    return (
      <div>
        <button onclick={() => this.setstate({ a: 1 })}>main</button>
        <a a={this.state.a} />
      </div>
    )
  }
}

函数组件

使用高阶组件react.memo来包裹函数式组件,它和类组件的purecomponent类似,也是对对props进行浅比较决定是否更新

const a = props => {
  console.log('render a')
  return <div>这是a组件</div>
}
// react.memo包裹a
const b = react.memo(a)

const main = props => {
  const [a, seta] = usestate(1)
  console.log('render main')

  return (
    <div>
      // 通过seta(a + 1)让父组件重新render
      <button onclick={() => seta(a + 1)}>main</button>
      // 一直传入相同的props不会让子组件重新render
      <b a={1} />
    </div>
  )
}

它的第二个参数接受一个两次props作为参数的函数,返回true则禁止子组件更新

其他

上面提到的浅比较就是根据内存地址判断是否相同:

// extends react.component
class a extends react.component {
  render() {
    console.log('render a')
    console.log(this.props)
    return <div>这是组件a</div>
  }
}

class main extends react.component {
  test = [1, 2, 3]
  render() {
    console.log('render main')
    return (
      <div>
        <button
          onclick={() => {
            // 父组件render
            this.setstate({})
            this.test.push(4)
          }}
        >
          main
        </button>
        <a test={this.test} />
      </div>
    )
  }
}

结果是:

使用react.component:

React优化子组件render的使用

使用react.purecomponent:

React优化子组件render的使用

使用react.component,点击之后子组件重新render。改为react.purecomponent之后,点击button子组件并不会render。也因此,purecomponent根据前后内存地址判断是否相等,所以向子组件传递函数作为props时,使用内联箭头函数的形式将会导致子组件的重新render;所以可以用箭头函数作为成员变量的形式再将函数引用作为props传递。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。