memo useMemo useCallback

这些并不是必要的hook/组件,但有性能问题可以尝试使用

举个例子:

有两个组件,App是父组件,A是子组件。App里有一个按钮点击它会进行setState,所以App会被重新渲染,如果父组件重新渲染,子组件会不会也重新渲染

js 复制代码
//App.jsx
import { useState, useEffect } from "react";
import A from "./A.jsx";
export default function App() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    console.log("父组件渲染");
  });
  function click() {
    setCount(count + 1);
  }
  return (
    <div className="App">
      <button onClick={click}>按钮</button>
      <A></A>
    </div>
  );
}
js 复制代码
//A.js
import React from "react";
import { useState, useEffect, useMemo, memo } from "react";
const A = () => {
  useEffect(() => {
    console.log("子组件渲染");
  });
  return <>123</>;
};
export default A;

点击按钮,可以看到父组件重新渲染,子组件也会重新渲染

但是如果子组件不需要重新渲染,这样就会影响性能了

memo

它是一个高阶组件,只需要用它包裹上面的子组件,就不会重新渲染了

js 复制代码
const A = memo(() => {
  useEffect(() => {
    console.log("子组件渲染");
  });
  return <>123</>;
});

memo 的作用就是只有 props 变的时候,才会重新渲染被包裹的组件

usecallback

然而如果给子组件传入一个函数

js 复制代码
 <A fn={fn}></A>

memo高阶组件失效了,因为每次 function 都是新创建的,也就是每次 props 都会变,这样 memo 就没用了。

这个时候就需要useCallback,它的第二个参数就是依赖项,不改变就不会创建新的函数

js 复制代码
  const fn = useCallback(() => {}, []);

现在memo就有作用了

useMemo

与vue的计算属性类似,使用方法类似于useCallback

当然也可以缓存组件,类似于memo高阶组件,甚至也可以缓存函数,但缓存函数一般用useCallback

js 复制代码
// useMemo 第一个参数是一个函数,第二个参数是依赖数组 
const sum = useMemo(() => { 
console.log('Calculating sum...'); 
return a + b; }, [a, b]); // a 和 b 是依赖项,只有它们发生变化时,才会重新计算 sum

但是如果没有明显性能问题,不需要使用它们,因为缓存本身就需要消耗性能,可读性也会变差,可能会得不偿失。

相关推荐
web小白成长日记3 小时前
企业级 Vue3 + Element Plus 主题定制架构:从“能用”到“好用”的进阶之路
前端·架构
APIshop3 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨3 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
XTTX1103 小时前
Vue3+Cesium教程(36)--动态设置降雨效果
前端·javascript·vue.js
LYFlied4 小时前
WebGPU与浏览器边缘智能:开启去中心化AI新纪元
前端·人工智能·大模型·去中心化·区块链
Setsuna_F_Seiei4 小时前
2025 年度总结:人生重要阶段的一年
前端·程序员·年终总结
model20054 小时前
alibaba linux3 系统盘网站迁移数据盘
java·服务器·前端
han_5 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
前端·javascript·面试
aPurpleBerry5 小时前
React 01 目录结构、tsx 语法
前端·react.js
jayaccc6 小时前
微前端架构实战全解析
前端·架构