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

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

相关推荐
Summer不秃1 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰5 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye12 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm14 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
乐闻x40 分钟前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚42 分钟前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
Amd7941 小时前
Nuxt.js 应用中的 webpack:compiled 事件钩子
前端·webpack·开发·编译·nuxt.js·事件·钩子
生椰拿铁You1 小时前
09 —— Webpack搭建开发环境
前端·webpack·node.js
狸克先生1 小时前
如何用AI写小说(二):Gradio 超简单的网页前端交互
前端·人工智能·chatgpt·交互
baiduopenmap2 小时前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图