美文网首页
4.React中Memo实现指定组件进行渲染

4.React中Memo实现指定组件进行渲染

作者: 海蒂Hedy | 来源:发表于2020-02-02 14:40 被阅读0次

memo可以解决react渲染时的效率问题,react可以将数据渲染在视图中,如果数据没有变化,视图还是重新渲染。
方法一:react中有个生命函数shouldComponentUpdate可以控制组件是否重新渲染。

import React, { Component }  from 'react';
import './App.css';
class Foo extends Component{
  render(){
    console.log('Foo render')
    return null; 
  }
}
class App extends Component{
  state = {
    count:0
  };

  //nextProps是下次渲染用到的props
  shouldComponentUpdate(nextProps,nextState){
    console.log('111',nextProps);
    if(nextProps.name === this.props.name){
      //不会渲染
      return false;
    }
    return true;
  }

  render(){
    return (
      <div className="app">
        <p>{this.state.count}</p>
        <button
          onClick={()=>{this.setState({count:this.state.count+1})}}
        >
            Add
        </button>
        <Foo name="jing"></Foo>
      </div>
    )
  }
}
export default App;

虽然App组件重新渲染了,但在它的子组件Foo中加上shouldComponentUpdate生命周期函数后,Foo组件可以通过name前后值是否发生变化来判断是否重新渲染。
也可以通过react中的PureComponent组件达到同样的效果。

import React, { Component, PureComponent}  from 'react';
import './App.css';
class Foo extends PureComponent{
  render(){
    console.log('Foo render')
    return null; 
  }
}
class App extends Component{
  state = {
    count:0
  };
  render(){
    return (
      <div className="app">
        <p>{this.state.count}</p>
        <button
          onClick={()=>{this.setState({count:this.state.count+1})}}
        >
            Add
        </button>
        <Foo name="jing"></Foo>
      </div>
    )
  }
}
export default App;

但是PureComponent的实现和使用场景是有局限性的,比如在state中定义一个引用类型的状态。

import React, { Component, PureComponent}  from 'react';
import './App.css';
class Foo extends PureComponent{
  render(){
    console.log('Foo render')
    //return null; 
  return <div>子组件person.age的值:{this.props.person.age}</div>
  }
}
class App extends Component{
  state = {
    count:0,
    person:{
      age:18
    }
  };
  render(){
    const person = this.state.person;
    return (
      <div className="app">
  <p>父组件person.age的值:{person.age}</p>
        <Foo person={person}></Foo>
        <button
          onClick={()=>{
            person.age++;
            this.setState({
              person
            })
          }}
        >
            Add
        </button>
       
      </div>
    )
  }
}


export default App;

此时Foo组件本应该重新渲染但并没有重新渲染,是因为PureComponent提供的shouldComponentUpdate发现person的句柄本身没有发生变化才拒绝重新渲染。只有传入的props第一级发生变化才会触发重新渲染。

方法3:memo
将Foo组件用react的memo包裹起来,App父组件发生变化时Foo组件没有被重新渲染。

import React, { Component, memo}  from 'react';
import './App.css';

const Foo = memo(function Foo(props){
  console.log('Foo reader');
  return <div>子组件person.age的值:{props.person.age}</div>
})
class App extends Component{
  state = {
    count:0,
    person:{
      age:18
    }
  };
  callback=()=>{}
  render(){
    const person = this.state.person;
    return (
      <div className="app">
        <p>count的值:{this.state.count}</p>
        <Foo person={person} cb={this.callback}></Foo>
        <button
         onClick={()=>{this.setState({
           count:this.state.count+1
         })}}
        >
            Add
        </button>
       
      </div>
    )
  }
}


export default App;

PureComponent为组件提供了对比算法来避免组件做无意义的渲染,减少性能开销。而无状态组件是函数式的,不能继承PureComponent,但可以用memo包裹函数式组件达到同样的效果。

相关文章

  • 4.React中Memo实现指定组件进行渲染

    memo可以解决react渲染时的效率问题,react可以将数据渲染在视图中,如果数据没有变化,视图还是重新渲染。...

  • React hooks中memo,usememo,useCall

    memomemo类似于PureCompoent 作用是优化组件性能,防止组件触发重渲染memo针对 一个组件的渲染...

  • useCallback(2)

    子组件是因为memo包裹,所以才当porps发生改变的时候渲染,如果没有memo包裹,无论props该不该变,父组...

  • React 性能优化 - 避免重复渲染

    对于函数组件是否需要再次渲染,可以根据 React.memo 与 React.useMemo 来优化。 函数组件优...

  • React中hooks之useCallback搭配memo

    React.memo类似于React.PureComponent,能对props做浅比较,防止组件无效的重复渲染 ...

  • React.memo

    先来看官网解释: React.memo 为高阶组件。如果你的组件在相同 props 的情况下渲染相同的结果,那么你...

  • react性能优化技巧

    1.使用纯组件2.使用 React.memo 进行组件记忆3.使用 shouldComponentUpdate 生...

  • React 中 memo. useMemo. UseCallba

    memo 用于减少组件的刷新次数,作用相当于PureComponent,会进行一个浅比较React.memo(co...

  • react新特性使用

    React.memo(CardItem,judgingUpdate)中的判断是否渲染的函数judgingUpdat...

  • 学习并实现react (3)

    复用组件 React 组件书写规则 组件可以直接渲染组件组件渲染多个children 时需要用 dom 元素进行包...

网友评论

      本文标题:4.React中Memo实现指定组件进行渲染

      本文链接:https://www.haomeiwen.com/subject/lwhqxhtx.html