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

相关推荐
前端snow3 分钟前
记录:非常典型的一个redux问题
前端
慧一居士12 分钟前
src/App.vue 和 public/index.html 关系和区别
前端·vue.js
九十一38 分钟前
websocket的连接原理
前端·javascript
念你那丝微笑1 小时前
vue实现批量导出二维码到PDF(支持分页生成 PDF)
前端·vue.js·pdf
Renounce1 小时前
《Android Handler:线程间通信的核心实现》
前端
CAD老兵1 小时前
打造高性能二维图纸渲染引擎系列(一):Batched Geometry 助你轻松渲染百万实体
前端·webgl·three.js
前端老宋Running1 小时前
微信小程序的操作日志收集模块
前端
CAD老兵1 小时前
打造高性能二维图纸渲染引擎系列(三):高性能 CAD 文本渲染背后的隐藏工程
前端·webgl·three.js
CAD老兵1 小时前
打造高性能二维图纸渲染引擎系列(二):创建结构化和可扩展的渲染场景
前端·webgl·three.js
王木风1 小时前
1分钟理解什么是MySQL的Buffer Pool和LRU 算法?
前端·mysql