当前位置: 首页 > article >正文

[react] 纯组件优化子

 有组件如下,上面变化秒数, 下面是大量计算的子组件,上面每一秒钟变化一次,这时候子组件会不断重新渲染, 浪费资源

父组件如下

import React, { memo, useEffect, useMemo, useState } from 'react';
import type { ReactNode, FC } from 'react';
import HugeCount from './Te';
interface IProps {
  children?: ReactNode;
}

const template: FC<IProps> = () => {
  const [time, setTime] = useState(new Date());

  useEffect(() => {
    console.log('渲染主体组件');
    setTimeout(() => {
      setTime(new Date());
    }, 1000);
  }, [time]);
  return (
    <div>
      {time.getSeconds()}
      <HugeCount  />
    </div>
  );
};

export default memo(template);

子组件如下

import React, { memo, useEffect, useMemo, useState } from 'react';
import type { ReactNode, FC } from 'react';

interface IProps {
  children?: ReactNode;
  data: {};
  bad: any;
}

const template: FC<IProps> = (props) => {
  const [num, setNum] = useState(100);
  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setNum(Number(e.target.value));
    props.bad();
  };
  const hugeCount = () => {
    console.log('大量计算');
    return num;
  };
  const result = useMemo(hugeCount, [num]);
  // const result = useMemo(()=>hugeCount(), [num]);
  useEffect(() => {
    console.log('渲染大量计算组件');
  });
  return (
    <div>
      <input type='text' onChange={(e) => handleChange(e)} />
      <div>大量计算结果:{result}</div>
    </div>
  );
};

export default template;

 什么是纯组件?

组件 的核心特性是避免不必要的渲染,它通过浅比较 propsstate 来决定是否更新 UI。纯组件本身不抑制副作用,它只是优化了渲染的过程。

先说state, 大量计算的子组件的state并未变化, 所以理应不变, 这时候先优化自身导出,用memo

这时候可了, 再说props,我在父组件传这个给子组件,然而秒数刷新子组件重新渲染,为什么

  const data = {name:"23"}

因为这个是引用类型,父组件秒数变化时刷新页面, 这个data会重新生成地址,所以props变了,子组件就刷新 ,那怎么办?

用useMemo,或者useState, 这2有缓存功能

 const [data, setData] = useState(33);

同理,你想传函数, 用useCallback,不然父组件重新渲染, 你子组件收到的函数是新的地址!! 然后重新渲染, 浪费性能

  function bad() {
    console.log('hahah');
  }
  const badFun = React.useMemo(() => bad, []);

 



小useMemo细节,2种写法都可, 前者比如是一个无参数, 后者可传参

  const result = useMemo(hugeCount, [num]); 
  const result = useMemo(()=>hugeCount(), [num]); 


http://www.kler.cn/a/463415.html

相关文章:

  • 非docker方式部署openwebui过程记录
  • 深度学习中的离群值
  • RabbitMQ基础篇之Java客户端快速入门
  • 实战设计模式之建造者模式
  • AMP 混合精度训练中的动态缩放机制: grad_scaler.py函数解析( torch._amp_update_scale_)
  • HarmonyOS鸿蒙开发 应用开发常见问题总结(持续更新...)
  • JMeter脚本参数化与并发策略
  • Vue 针对浏览器参数过长实现浏览器参数加密解密
  • 人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念
  • FPGA实现HDMI输出
  • 2024树莓派apt源(可用)
  • 【Leetcode 热题 100】79. 单词搜索
  • Amazon Bedrock 实践 - 利用 Llama 3.2 模型分析全球糖尿病趋势
  • uni-app开发-识图小程序-分类识别功能
  • [微服务] - MQ高级
  • 游戏引擎学习第69天
  • doris:基于 Arrow Flight SQL 的高速数据传输链路
  • 小红书ip属地是怎么更新的
  • redis如何实现延时队列
  • 基于单片机的无线智能台灯(论文+源码)
  • STM32单片机芯片与内部54 AT24C02读写 硬件IIC 标准库 HAL库
  • 生态碳汇涡度相关监测与通量数据分析
  • 【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
  • uniapp——微信小程序,从客户端会话选择文件
  • Linux | 零基础Ubuntu解压RaR等压缩包文件
  • 【MySQL高级】第1-4章