对比之前的组件优化说明React.memo的作用

我们之前写的react PureComponent讲述了 PureComponent 组件优化特性的强大功能
还有就是 shouldComponentUpdate 生命周期的一个解决方案
那么呢 今天我们要说另一个 也是类似于组件性能优化的新特性

打开我们的react项目
在src下的components创建一个组件
例如 我这里叫 dom.jsx
参考代码如下

import React from "react";

export default class record extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      cont: 0,
    }
  }
  
  componentDidMount = () => {
    this.myTarget = setInterval(()=>{
      this.setState({
        cont: 1
      });
    }, 1000);
  }

  render(){
    console.log("组件被重写渲染");
    return (
      <div className="App">
         { this.state.cont }
      </div>
    )
  }
}

然后 在App根组件中引入这个组件
我们可以看到 我们这个组件在componentDidMount生命周期中定义了一个定时器 每秒将响应式数据cont赋一次值
但是 既然都是1 那是不是 render 渲染一次就够啦?
因为值都是一样的
我们运行项目
在这里插入图片描述可以看到 虽然我们赋值的都是 1 但是 它相当于我们每次调用setState render就会重新挂一次界面

那么 我们按之前学的解决方案就是 将 React.Component 改成 React.PureComponent
这样 就不会每次更改 就算值相同都一直重新渲染界面了

还有一种办法 就是将组件代码改成这样

import React from "react";

export default class record extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      cont: 0,
    }
  }

  shouldComponentUpdate = (props,state) => {
    return state.cont !== this.state.cont;
  }
  
  componentDidMount = () => {
    this.myTarget = setInterval(()=>{
      this.setState({
        cont: 1
      });
    }, 1000);
  }

  render(){
    console.log("组件被重写渲染");
    return (
      <div className="App">
         { this.state.cont }
      </div>
    )
  }
}

我们知道 修改组件响应式数据 会触发的生命周期是 shouldComponentUpdate componentWillUpdate render componentDidUpdate
而 其中 shouldComponentUpdate 中 可以返回一个值 类型为 true/false 一点返回false 在shouldComponentUpdate后执行的生命周期都不会执行
shouldComponentUpdate 接收两个行参 第一个 是 父组件传过来的值 第二个是本组件的state
需要注意的是 shouldComponentUpdate接回来的这个state中的值 是更改之前的
那么 我们就完全可以用shouldComponentUpdate接到的state和组件this中的state去做比较 判断这次有没有改变
这样 我们就相当于写了个条件 如果 state 和 this.state中的cont不一样 那就是true 允许后面的生命周期执行 否则 直接返回false 后面的生命周期就不会执行 包括render

我们在components创建一个dom1.jsx
参考代码如下

import React from "react"
const Dom = () => {
    console.log("Dom1组件被重新渲染");
    return (
      <div>
        子组件
      </div>
    );
  };
export default Dom;

然后 我们将dom.jsx代码更改如下

import React from "react";
import Dom1 from "./dom1";

export default class record extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      cont: 0,
    }
  }

  shouldComponentUpdate = (props,state) => {
    return state.cont !== this.state.cont;
  }
  
  componentDidMount = () => {
    this.myTarget = setInterval(()=>{
      this.setState({
        cont: this.state.cont+1
      });
    }, 1000);
  }

  render(){
    return (
      <div className="App">
         { this.state.cont }
         <Dom1/>
      </div>
    )
  }
}

运行结果如下
在这里插入图片描述
很明显 我们的子组件dom1并没有和父组件的 cont 发生关系 但 父组件的cont每次变化 dom1 也都跟着重新渲染了
这个问题 我们只需要改一下导出的语法
有一个新特性专门解决这个问题

export default Dom;

改成

export default React.memo(Dom);

在这里插入图片描述
很明显 执行过开始的之后 就不会再触发了
这就是React.memo的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值