react18中的计算属性及useMemo的性能优化技巧

react18里面的计算属性和使用useMemo来提升组件性能的方法

计算属性

  • 实现效果
  • 代码实现
    函数式组件极简洁的实现,就这样
js 复制代码
import { useState } from "react";
function FullName() {
  const [firstName, setFirstName] = useState("");
  const [lastName, setLastName] = useState("");
  const fullName = firstName + " " + lastName;
  return (
    <>
      <h1>fullname:{fullName}</h1>

      <label>
        First Name :
        <input
          type="text"
          value={firstName}
          onChange={(e) => setFirstName(e.target.value)}
        />
      </label>

      <br />
      <label>
        Last Name :
        <input
          type="text"
          value={lastName}
          onChange={(e) => setLastName(e.target.value)}
        />
      </label>
    </>
  );
}

export default FullName;

计算大的方法缓存

子组件会因为props和state的变化而重新渲染,这其中如果有很大计算量的方法的话,就会严重拖慢页面加载速度。像下面这种就是因为一个无关的更新,导致计算一会在执行,计算量大的话性能损耗很大

js 复制代码
import { useState, useMemo } from "react";
function TodoList({ todos, filter }) {
  const [newTodo, setNewTodo] = useState("");
  const visibleTodos = getFilteredTodos(todos, filter);
  return (
    <>
      <ul>
        {visibleTodos.map((todo) => {
          return <li>{todo.name}</li>;
        })}
      </ul>
      {newTodo}
      <br />
      <input value={newTodo} onChange={(e) => setNewTodo(e.target.value)} />
    </>
  );
}

function getFilteredTodos(todos, filter) {
  console.log("🚀 ~ getFilteredTodos ~ todos:", todos);
  return todos.filter((todo) => {
    return filter.call(null, todo);
  });
}
export default TodoList;

优化代码

js 复制代码
import { useState, useMemo } from "react";
function TodoList({ todos, filter }) {
  const [newTodo, setNewTodo] = useState("");
  const visibleTodos = useMemo(
    () => getFilteredTodos(todos, filter),
    [todos, filter]
  );
  return (
    <>
      <ul>
        {visibleTodos.map((todo) => {
          return <li>{todo.name}</li>;
        })}
      </ul>
      {newTodo}
      <br />
      <input value={newTodo} onChange={(e) => setNewTodo(e.target.value)} />
    </>
  );
}

function getFilteredTodos(todos, filter) {
  console.log("🚀 ~ getFilteredTodos ~ todos:", todos);
  return todos.filter((todo) => {
    return filter.call(null, todo);
  });
}
export default TodoList;


这会告诉 React,除非 todos 或 filter 发生变化,否则不要重新执行传入的函数,这样我们我们的计算就不会在无关的状态变化时执行了,极大的提升了性能。

相关推荐
Andrew5513 小时前
让 AI 写页面不再“一眼假”:我把设计品味做成了一个 Claude Code Skill 流水线
前端
乐享qicheng3 小时前
14-AI智能管家JSBridge深度问答
前端
10年前端老司机3 小时前
我用 Vue3 + LangGraph 做了个心理咨询 AI,踩了 9 个坑后总结出来的实战经验
前端·langchain·agent
数据掘金3 小时前
A/B 实验分组参数回滚后还在生效?一次参数校验体系的重构复盘
前端
bmxy小明同学4 小时前
2026-10-09-token与成本
java·前端·数据库
neoooo4 小时前
🚀Claude Code 小技巧(二):找回会话,撤销修改
前端·人工智能·后端
今年下半年4 小时前
【文件上传】记录一次大附件上传的处理方案
前端·文件上传·内存溢出·分段上传
溪语流沙4 小时前
【每天一个CSS | Day21】落地页Hero动画的分镜表
前端·css
neoooo4 小时前
🚀Claude Code 小技巧(一):一键进入危险模式
前端·人工智能·后端
bmxy小明同学6 小时前
2026-10-11-幻觉治理
服务器·前端·javascript