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;

计算大的方法缓存

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

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 发生变化,否则不要重新执行传入的函数,这样我们我们的计算就不会在无关的状态变化时执行了,极大的提升了性能。

相关推荐
郑州光合科技余经理2 小时前
海外O2O系统源码剖析:多语言、多货币架构设计与二次开发实践
java·开发语言·前端·小程序·系统架构·uni-app·php
arvin_xiaoting7 小时前
OpenClaw学习总结_I_核心架构_8:SessionPruning详解
前端·chrome·学习·系统架构·ai agent·openclaw·sessionpruning
工程师老罗8 小时前
Image(图像)的用法
java·前端·javascript
早點睡3908 小时前
ReactNative项目OpenHarmony三方库集成实战:react-native-swiper
javascript·react native·react.js
swipe9 小时前
把 JavaScript 原型讲透:从 `[[Prototype]]`、`prototype` 到 `constructor` 的完整心智模型
前端·javascript·面试
问道飞鱼9 小时前
【前端知识】React 组件生命周期:从底层原理到实践场景
前端·react.js·前端框架·生命周期
CHU7290359 小时前
定制专属美丽时刻:美容预约商城小程序的贴心设计
前端·小程序
浩~~10 小时前
反射型XSS注入
前端·xss
AwesomeDevin10 小时前
AI时代,我们的任务不应沉溺于与 AI 聊天,🤔 从“对话式编程”迈向“数字软件工厂”
前端·后端·架构
harrain10 小时前
antvG2折线图和区间range标记同时绘制
前端·javascript·vue.js·antv·g2