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

react项目性能优化的hook

前言:

        在项目中开发中,性能优化是很重要的,react有提供专门的hook,useMemo useCallback 这里说一说他们。

区别:

特性useMemouseCallback
返回值缓存一个 (计算结果)缓存一个 函数
依赖变化时重新计算值重新创建函数
典型用途避免昂贵计算重复执行避免子组件因函数引用变化重渲染
语法useMemo(() => value, deps)useCallback(() => fn, deps)

useMemo 的适用场景

  1. 昂贵计算缓存
    当组件中有需要复杂计算的值(如过滤列表、数学运算等),可以用 useMemo 避免每次渲染重复计算。

    jsx

    const filteredList = useMemo(() => {return largeList.filter(item => item.price > 100);
    }, [largeList]);

  2. 避免不必要的对象/数组重新创建
    如果传递给子组件的 props 是对象或数组,且依赖项未变化时,用 useMemo 缓存它们。

    jsx

    const config = useMemo(() => ({ color: 'red', size: 10 }), []);
    return <ChildComponent config={config} />;


useCallback 的适用场景

  1. 防止子组件无效重渲染
    当父组件传递一个函数给子组件(尤其是 React.memo 优化的子组件)时,用 useCallback 缓存函数,避免因父组件重渲染导致函数引用变化,触发子组件更新。

    jsx

    const handleClick = useCallback(() => {console.log('Clicked!');
    }, []);return <MemoizedChild onClick={handleClick} />;

总结:

  • useMemo → 缓存 (计算结果、对象/数组)。

  • useCallback → 缓存 函数(避免子组件重渲染、稳定依赖项)。

简结

  • 需要缓存函数?用 useCallback

  • 需要缓存其他值?用 useMemo

实际项目使用场景:

1、封装redux的user.ts中
import { UserInfo } from "@/types";
import { useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";
import { setUserInfoAction, clearUser } from "../action";
import { getStateUser } from "../getter";export const useStateUserInfo = () => useSelector(getStateUser)export function useDispatchUser() {const dispatch = useDispatch()const stateSetUser = useCallback((info: UserInfo) => dispatch(setUserInfoAction(info)), [dispatch])const stateClearUser = useCallback(() => dispatch(clearUser()), [dispatch])return { stateSetUser, stateClearUser }
}
2、封装路由跳转的地方,router.tsx
import { useEffect, useMemo, useState } from "react";
import { Routes, Route } from "react-router-dom";....const routerBody = useMemo(() => {// 监听 本地路由列表   同时存在长度大于1时 渲染路由组件if (mergeRouterList.length) {const data = mergeRouterList.map((item) => {let { [MENU_KEY]: key, [MENU_PATH]: path } = item;return (<Routekey={key}path={path.replace("/", "")}element={<Intercept{...item}menuList={ajaxUserMenuList}pageKey={key}/>}/>);});return <Routes>{data}</Routes>}return null}, [ajaxUserMenuList, mergeRouterList])return routerBody;
...

http://www.dtcms.com/a/333051.html

相关文章:

  • UGUI源码剖析(9):布局的实现——LayoutGroup的算法与实践
  • java程序打包成exe,再打成安装包,没有jdk环境下可运行
  • 【完整源码+数据集+部署教程】孔洞检测系统源码和数据集:改进yolo11-RetBlock
  • 金刚石基植入体新突破!Adv. Funct. Mater. 报道首例增材制造固态摩擦电能量收集器
  • 【FastGTP✨】[01] 使用 FastGPT 搭建简易 AI 应用
  • 部署Qwen-Image,通过API返回可访问的图像URL
  • 以下是对智能电梯控制系统功能及系统云端平台设计要点的详细分析,结合用户提供的梯控系统网络架构设计和系统软硬件组成,分点论述并补充关键要点:
  • 一文打通 AI 知识脉络:大语言模型等关键内容详解
  • 铨林接纸机学习记录1
  • AI智能文档生成系统需求规格说明书
  • Linux 进程、线程与 exec/系统调用详解
  • MySQL中的字符串函数
  • PowerShell 格式化系统完全掌握(下):自定义列/格式字符串/对齐与宽度 + 实战模板
  • 抗日胜利80周年 | HTML页面
  • 智和信通全栈式运维平台落地深圳某学院,赋能运维管理提质提效
  • TCP传输层协议(4)
  • 微信实名认证组件
  • 二十四、Mybatis-基础操作-删除(预编译SQL)
  • SAP ALV导出excel 报 XML 错误的 /xl/sharedStrings.xml
  • Android协程的用法大全
  • 汽车电子:现代汽车的智能核心
  • Unity_数据持久化_Json
  • 使用原生css实现word目录样式,标题后面的...动态长度并始终在标题后方(生成点线)
  • 第七十章:告别“手写循环”噩梦!Trainer结构搭建:PyTorch Lightning让你“一键炼丹”!
  • Codeforces Deque工艺
  • 用 FreeMarker 动态构造 SQL 实现数据透视分析
  • STM32学习笔记12-串口数据包收发FlyMcuST-LINK Utility
  • Shortest Routes II(Floyd最短路)
  • 管家婆辉煌系列试用版/期限说明
  • Shader开发(十三)理解片元插值