当前位置: 移动技术网 > IT编程>开发语言>JavaScript > React优化子组件render的使用

React优化子组件render的使用

2019年07月21日  | 移动技术网IT编程  | 我要评论

在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.purecomponent:

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网