React18 怎么实现 vue3 computed 的效果

React 18 中可以使用 useMemo hook 来实现类似 Vue 3 computed 的效果。以下是一些实现方法:

  1. 使用 useMemo 实现基本的计算属性:
typescript 复制代码
import { useMemo } from 'react';

function MyComponent({ a, b }) {
  const sum = useMemo(() => a + b, [a, b]);

  return <div>Sum: {sum}</div>;
}
  1. 对于复杂的计算,可以将逻辑封装在一个函数中:
typescript 复制代码
import { useMemo } from 'react';

function MyComponent({ items }) {
  const totalPrice = useMemo(() => {
    return items.reduce((total, item) => total + item.price, 0);
  }, [items]);

  return <div>Total Price: {totalPrice}</div>;
}
  1. 如果计算依赖于多个状态,可以将它们组合在一个对象中:
typescript 复制代码
import { useMemo } from 'react';

function MyComponent({ user, products }) {
  const userProductInfo = useMemo(() => {
    return {
      name: user.name,
      totalPurchases: products.filter(p => p.userId === user.id).length
    };
  }, [user, products]);

  return (
    <div>
      <p>User: {userProductInfo.name}</p>
      <p>Total Purchases: {userProductInfo.totalPurchases}</p>
    </div>
  );
}
  1. 对于需要频繁更新的计算属性,可以结合使用 useCallback:
typescript 复制代码
import { useMemo, useCallback } from 'react';

function MyComponent({ data }) {
  const processedData = useMemo(() => {
    // 复杂的数据处理逻辑
    return data.map(item => ({ ...item, processed: true }));
  }, [data]);

  const getItemById = useCallback((id) => {
    return processedData.find(item => item.id === id);
  }, [processedData]);

  return (
    <div>
      {/* 使用 processedData 和 getItemById */}
    </div>
  );
}

使用 useMemo 可以确保只有在依赖项发生变化时才重新计算值,从而优化性能。这与 Vue 3 的 computed 属性类似,都是用于缓存计算结果并在依赖更新时重新计算。

需要注意的是,不要过度使用 useMemo,因为它也会增加内存使用。只在计算成本较高或者需要避免不必要的重渲染时使用它。

Citations:

1 https://blog.logrocket.com/vue-3-react-developers-side-by-side-comparison-demos/

2 https://stackoverflow.com/questions/73523864/best-way-to-replace-computed-properties-of-vue-in-react

3 https://betterprogramming.pub/how-to-incrementally-migrate-from-vue-js-2-to-react-18-part-1-setup-be2cd04458f0?gi=12d5a286da55

4 https://github.com/gloriasoft/veaury

5 https://vuejs.org/guide/essentials/computed.html

相关推荐
sbjdhjd5 小时前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
乐兮创想 小林6 小时前
企业官网移动端性能优化实战:从 Core Web Vitals 到图片/CDN/响应式的工程清单
前端·性能优化·网站建设·北京网站建设公司
疯狂SQL6 小时前
JWT 在线解码、验签、生成一篇讲透:附前端实现、工具架构与在线体验地址
javascript·jwt·编解码·jwt测试
前端一小卒6 小时前
不手写代码的第 30 天,我才明白前端这个岗位还剩什么
前端·javascript·ai编程
Ajie'Blog6 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
老毛肚6 小时前
jeecgboot vue TS & 模板化 04
前端·javascript·vue.js
晓13137 小时前
【Cocos Creator 2.x】篇——第二章 入门
javascript·游戏引擎
AI_零食8 小时前
鸿蒙PC Electron跨平台应用开发:24时区时间表应用详解
前端·华为·electron·开源·harmonyos·鸿蒙
Electrolux8 小时前
[onlyoffice-v9]纯前端怎么实现编辑预览office
前端·javascript·github
VidDown9 小时前
Webhook 调试器:让第三方回调“原形毕露”
java·开发语言·javascript·编辑器·postman