(17)React 进阶——⑦ React 生命周期函数(中):巧用 shouldComponentUpdate 提升组件性能 | React 基础理论实操

复制代码
转载请注明出处,未经同意,不可修改文章内容。

🔥🔥🔥"前端一万小时"两大明星专栏------"从零基础到轻松就业"、"前端面试刷题",已于本月大改版,合二为一,干货满满,欢迎点击公众号菜单栏各模块了解。

javascript 复制代码
涉及面试题:
如何提高性能?

编号:[react_17]

1 为什么只有 render 函数需要我们自己定义

❗️为了便于讲解,请将 TodoList 里的代码同步至《React 入门:⑥ TodoList 代码优化》中的版本。

在这个版本中,我们发现:上一篇讲的所有"生命周期函数",在这里只出现了一个 render 。基于此,我们也可以反向得出:在 React 里,除了 render ,其他剩余的"生命周期函数"都可以不显式地写出来。

因为,在 TodoList 组件里:

javascript 复制代码
class TodoItem extends Component {
  
}

TodoList 组件是继承自 Component 这个组件的。在 React 的 Component 组件里,它默认内置了除 render 以外的所有"生命周期函数"。

故,我们需要自己去定义 render 函数,否则程序就会报错(不信,你可以删掉 render 试一下)。

接着,我们开始本篇的重点:怎样用"生命周期函数" shouldComponentUpdate 去提升组件性能?

2 shouldComponentUpdate 怎么用

打开 TodoItem.js 文件:

jsx 复制代码
import React, { Component } from "react";

class TodoItem extends Component {
  constructor(props) {
    super(props);
    
    this.handleClick = this.handleClick.bind(this);
  } 
  
  render() {
    console.log("child render") /*
    														我们在这里让控制台打印一些信息,
    														以帮助我们直观地观察到 render 函数被自动执行;
                                 */
    
    const {content} = this.props
    
    return(
      <div onClick={this.handleClick}> 
        {content}  
      </div>
    )
  }
  
  handleClick() {  
    const {itemDelete, index} = this.props
    
    itemDelete(index)
  }
}

export default TodoItem;

2️⃣观察以下短视频中我在页面的操作(会发现,我们在页面 input 框------父组件里的任何操作,都会触发子组件 render 函数的执行):

❌这就带来一个"性能损耗 "的问题:

因为,我在页面 input 框输入内容且未提交时,子组件根本就没必要跟着不停渲染。

❓怎样去做"性能"优化呢?

答:利用"生命周期函数" shouldComponentUpdate

jsx 复制代码
import React, { Component } from "react";

class TodoItem extends Component {
  constructor(props) {
    super(props);
    
    this.handleClick = this.handleClick.bind(this);
  } 
  
  // 🏆我们可以在这个"生命周期函数"里去定义一些逻辑:
  shouldComponentUpdate(nextProps, nextState) { /*
  																		1️⃣首先,这个函数会接收两个参数:
  																		nextProps 和 nextState。
                                      
                                      它们分别指,当我的这个组件要被"更新"的时候:
                                  		①nextprops------"接下来,我的 props"会被变成什么样;
                                 		  ②nextState------"接下来,我的 state"会被变成什么样。
                                 		             */
    
    if(nextProps.content !== this.props.content) { /*
    																						2️⃣如果"接下来,我的 props"里的 content,
                                                不等于当前 props 里的 content;
                                                	  */
      
      return true; // 3️⃣我就返回 true,因为 content 的值发生了变化,我需要让这个子组件重新渲染;
    }else {
      return false; // 4️⃣否则,返回 false,不用渲染子组件。
    }
  
    
  }
  
  render() {
    console.log("child render")  
    const {content} = this.props
    
    return(
      <div onClick={this.handleClick}> 
        {content}  
      </div>
    )
  }
  
  handleClick() {  
    const {itemDelete, index} = this.props
    
    itemDelete(index)
  }
}

export default TodoItem;

返回页面控制台查看变化(子组件不再作无谓的渲染):

祝好,qdywxs ♥ you!

相关推荐
程序猿阿伟1 小时前
《Chrome标签组搭建多任务高效浏览指南》
前端·chrome
2601_958352901 小时前
双麦 DSP 音频模块实战:一文梳理 A-68 在全行业场景的声学解决方案与落地要点
前端·嵌入式硬件·音视频·语音识别·降噪消回音·音频处理模块
智码看视界1 小时前
老梁聊全栈:JavaScript 原型链深入探索对象继承的奥秘
前端·javascript·ecmascript
智码看视界1 小时前
老梁聊全栈系列 JavaScript语言本质:从原型链到异步编程的深度解析
开发语言·javascript·全栈·javascript核心
布朗克1681 小时前
39 Spring Boot Web实战
前端·spring boot·后端·实战
纽格立科技2 小时前
DRM 发射端链路图(上)
前端·人工智能·车载系统·信息与通信·传媒
云水一下2 小时前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq4356947012 小时前
Vue05
前端·vue.js
qq_422152572 小时前
PDF 解密工具怎么选?2026 年文档密码移除方案与注意事项
java·前端·pdf
YHHLAI2 小时前
前端工程化调用 AI 多模态生图模型:Qwen Image Demo 实战
前端·人工智能