性能优化-react阻止子组件重渲染

因为父组件的状态变更会触发子组件的渲染,可以用shouldComponentUpdate或memo来阻止。下面就来介绍这两种方法。

类组件-shouldComponentUpdate

注:变化需要在render中打印,在component中检测不到

核心代码: 子组件中用shouldComponentUpdate防止子组件重渲染

复制代码
// 性能优化
shouldComponentUpdate(nextProps, nextState) {
  if (nextProps.num === this.props.num) return false;
  return true;
}

完整例子

父组件

复制代码
export default class Index extends Component {
  state = {
    num1: 111,
    num2: 222,
  };
  render() {
    return (
      <div>
        <button onClick={() => this.setState({ num1: this.state.num1 + 1 })}>
          修改num1
        </button>
        <button onClick={() => this.setState({ num2: this.state.num2 + 1 })}>
          修改num2
        </button>
        // 子组件
        <Schild num={this.state.num1} />
      </div>
    );
  }
}

子组件

复制代码
import { Component } from "react";
export default class Index extends Component {
  constructor(props) {
    super(props);
  }

  // 性能优化
  shouldComponentUpdate(nextProps, nextState) {
    if (nextProps.num === this.props.num) return false;
    return true;
  }

  render() {
    // 父组件的状态变更会触发子组件的渲染
    console.log("渲染子组件");
    return (
      <div>
        <h3>s子组件</h3>
        <div>来自父组件的num1:{this.props.num}</div>
      </div>
    );
  }
}

函数组件-memo

可阻止子组件页面重渲染

核心代码:export default memo(Child);

详细代码

子组件

js 复制代码
import { useEffect, memo } from "react";

const Child = ({ num }) => {
  useEffect(() => {
    console.log("渲染子组件");
  });

  return (
    <div>
      <h1>我是子组件</h1>
      <div>来自父组件的参数:{num}</div>
    </div>
  );
};
export default memo(Child);

父组件

js 复制代码
import { useEffect, useState, useMemo } from "react";

import Child from "./child";
const Home = () => {
  const [num1, setNum1] = useState(111);
  const [num2, setNum2] = useState(222);

  return (
    <div>
      <h1>性能优化-usemome</h1>
      <div>
        num1: {num1};num2: {num2};
      </div>
      <button onClick={() => setNum1(num1 + 1)}>修改num1</button>
      <button onClick={() => setNum2(num2 + 1)}>修改num2</button>
      <Child num={num1} />
    </div>
  );
};
export default Home;

好了,以上就是优化的两种方案。

相关推荐
择势4 分钟前
macOS App 签名与公证流程详解及一键自动化
前端
英俊潇洒美少年16 分钟前
Vue3 中 watch的 flush 选项(默认无/`post`/`sync`)的区别
前端·javascript·vue.js
闲云一鹤19 分钟前
Python 入门(三)- PyAutoGUI 自动化教程
前端·python·黑客
D_C_tyu22 分钟前
HTML | 结合Canvas开发具有智能寻路功能的贪吃蛇小游戏实战详解
javascript·算法·游戏·html·bfs
Jay-r24 分钟前
樱花雨特效 WebGL实现 短视频同款浪漫视觉效果(附源码下载)
开发语言·javascript·ecmascript·编程·webgl·代码·樱花雨
凤山老林25 分钟前
Js如何实现一个抽奖程序
前端·javascript·vue.js
我命由我1234526 分钟前
React - Switch、路由精准匹配与模糊匹配、Redirect
开发语言·前端·javascript·react.js·前端框架·html·ecmascript
陆枫Larry33 分钟前
用 Git 别名(Alias)简化日常操作
前端
阿泽·黑核36 分钟前
Easy Vibe Coding 学习心得(三):前端之美——从设计稿到精美界面
前端·vibe coding·easy vibe
无心水1 小时前
【时间利器】4、JavaScript时间处理全解:Date/moment/dayjs/Temporal
开发语言·前端·javascript·状态模式·openclaw·date/moment·dayjs/temporal