react学习1:useMemo 与vue cumputed

56 阅读2分钟

概述

React 的 useMemo 和 Vue 的 computed 都用于优化性能,避免不必要的重复计算。虽然它们的实现方式不同,但核心思想是一致的。

功能对比

React useMemo

import React, { useState, useMemo } from 'react';

const MyComponent: React.FC = () => {
  const [count, setCount] = useState(0);
  const [expensiveValue, setExpensiveValue] = useState(1000);

  // 使用 useMemo 记忆化计算结果
  const memoizedResult = useMemo(() => {
    console.log('执行昂贵的计算...');
    return expensiveValue * 2 + count;
  }, [expensiveValue, count]); // 依赖数组

  return (
    <div>
      <p>计算结果: {memoizedResult}</p>
      <button onClick={() => setCount(count + 1)}>
        增加计数 (触发重新渲染)
      </button>
    </div>
  );
};

Vue 3 Composition API (computed)

<template>
  <div>
    <p>计算结果: {{ memoizedResult }}</p>
    <button @click="count++">
      增加计数 (触发重新渲染)
    </button>
  </div>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue';

const count = ref(0);
const expensiveValue = ref(1000);

// 使用 computed 计算属性
const memoizedResult = computed(() => {
  console.log('执行昂贵的计算...');
  return expensiveValue.value * 2 + count.value;
});
</script>

Vue 2 Options API (computed)

<template>
  <div>
    <p>计算结果: {{ memoizedResult }}</p>
    <button @click="count++">
      增加计数 (触发重新渲染)
    </button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      count: 0,
      expensiveValue: 1000
    };
  },
  computed: {
    // 计算属性会自动缓存结果
    memoizedResult() {
      console.log('执行昂贵的计算...');
      return this.expensiveValue * 2 + this.count;
    }
  }
};
</script>

主要差异

特性

React useMemo

Vue computed

语法

Hook 函数

计算属性

依赖管理

手动指定依赖数组

自动追踪依赖

缓存策略

基于依赖数组变化

基于响应式数据变化

使用场景

需要精确控制依赖

自动响应式更新

性能开销

需要手动管理依赖

自动优化

性能优化建议

React useMemo 最佳实践

  • ✅ 用于昂贵的计算

  • ✅ 用于避免子组件不必要的重新渲染

  • ✅ 确保依赖数组包含所有必要项

  • ❌ 不要过度使用,useMemo 本身也有开销

  • ❌ 对于简单计算,直接计算更好

Vue computed 最佳实践

  • ✅ 用于需要缓存的计算结果

  • ✅ 用于派生状态

  • ✅ 自动优化,无需手动管理依赖

  • ❌ 避免在 computed 中产生副作用

  • ❌ 避免过于复杂的计算逻辑

总结

框架

优势

劣势

React useMemo

精确控制依赖、灵活性高

需要手动管理依赖、容易出错

Vue computed

自动依赖追踪、语法简洁

依赖自动追踪可能带来意外行为

两者都是优秀的性能优化工具,选择哪个主要取决于你的项目框架和具体需求。