当前位置: 首页 > news >正文

Vue学习笔记集--computed

computed

在 Vue 3 的 Composition API 中,computed 用于定义响应式计算属性

它的核心特性是自动追踪依赖缓存计算结果(依赖未变化时不会重新计算)


基本用法

1. 定义只读计算属性
import { ref, computed } from 'vue';

const count = ref(0);
const doubleCount = computed(() => count.value * 2); // 返回一个 Ref 对象

console.log(doubleCount.value); // 0 → 初始值
count.value = 2;
console.log(doubleCount.value); // 4 → 自动更新
2. 在模板中使用
<template>
  <div>{{ doubleCount }}</div> <!-- 自动解包,无需 .value -->
</template>

computed 的响应式依赖

  • 自动追踪依赖:计算属性会追踪其内部使用的所有响应式变量(如 refreactive)。
  • 缓存机制:只有依赖变化时才会重新计算,否则直接返回缓存值。
const a = ref(1);
const b = ref(2);
const sum = computed(() => a.value + b.value);

a.value = 3; // sum 自动重新计算 → 3 + 2 = 5
b.value = 4; // sum 再次计算 → 3 + 4 = 7

可写计算属性(Setter)

computed 可以接受一个包含 getset 的对象,实现双向绑定:

const firstName = ref('John');
const lastName = ref('Doe');

// 可写计算属性
const fullName = computed({
  get: () => `${firstName.value} ${lastName.value}`,
  set: (newValue) => {
    const [first, last] = newValue.split(' ');
    firstName.value = first;
    lastName.value = last;
  },
});

// 修改计算属性
fullName.value = 'Jane Smith'; // 自动更新 firstName 和 lastName
console.log(firstName.value); // 'Jane'
console.log(lastName.value); // 'Smith'

reactive 结合使用

将计算属性绑定到 reactive 对象中:

import { reactive, computed } from 'vue';

const state = reactive({
  price: 100,
  quantity: 2,
});

// 计算总价
state.total = computed(() => state.price * state.quantity);

console.log(state.total.value); // 200

性能优化:避免重复计算

计算属性会缓存结果,以下场景体现优势:

const list = ref([1, 2, 3, 4, 5]);

// 计算过滤后的列表(只有 list 变化时重新计算)
const evenNumbers = computed(() => list.value.filter(num => num % 2 === 0));

list.value.push(6); // evenNumbers 自动更新为 [2,4,6]

注意事项

  1. 避免副作用:计算属性应是纯函数,不要在其中修改外部状态。

    // ❌ 错误示例(副作用)
    const invalidComputed = computed(() => {
      count.value++; // 禁止修改依赖!
      return count.value;
    });
    
  2. 依赖非响应式数据:如果依赖非响应式变量,计算属性不会更新:

    let staticValue = 10;
    const badComputed = computed(() => staticValue); // 不会更新!
    
  3. 性能敏感场景:复杂计算建议使用 computed 缓存结果,而非在模板中直接调用方法。


与 Vue 2 的对比

特性Vue 2 的 computedVue 3 的 computed
定义位置computed 选项setup 中通过函数定义
返回值类型直接通过属性访问Ref 对象(需 .value 访问)
响应式依赖追踪自动自动
可写性不支持 Setter支持 Setter

完整示例

<template>
  <div>
    <input v-model="price" type="number" placeholder="价格">
    <input v-model="quantity" type="number" placeholder="数量">
    <p>总价: {{ total }}</p>
    <button @click="resetTotal">重置总价</button>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const price = ref(0);
const quantity = ref(0);

// 计算总价
const total = computed({
  get: () => price.value * quantity.value,
  set: (value) => {
    price.value = value / 2;
    quantity.value = 2;
  },
});

// 通过 Setter 修改计算属性
const resetTotal = () => {
  total.value = 0; // 触发 Setter → price=0, quantity=0
};
</script>

相关文章:

  • 蓝桥杯-特殊的多边形(dfs/前缀和)
  • 指针和引用
  • 业务流程先导及流程图回顾
  • YOLO基础知识
  • 【C语言文件精选题】
  • 《网络管理》实践环节01:OpenEuler22.03sp4安装zabbix6.2
  • 验证Linux多进程时间片切换的程序
  • PyTorch 张量的new_tensor方法介绍
  • 算法基础——树
  • RAG基建之PDF解析的“流水线”魔法之旅
  • 网络安全-网络安全基础
  • freecad gear模块 生成齿轮导出fcstd step
  • 20组电影美学RED摄像摄影机视频胶片模拟色彩分级调色LUT预设包 Pixflow – CL – RED Camera LUTs
  • 项目实战--权限列表
  • Mybatis日志模块分析--适配器模式+代理模式
  • 身份验证:区块链如何让用户掌控一切
  • Scrapy对比Selenium:哪个最适合您的网络爬虫项目
  • 深度学习Note.5(机器学习2)
  • Unity中UDP异步通信常用API使用
  • Python小练习系列 Vol.7:全排列生成(回溯算法模板题)
  • 南京106亿元成交19宗涉宅地块:建邺区地块楼面单价重回4.5万元
  • 国家卫健委有关负责人就白皮书发布答记者问
  • 神十九飞船已撤离空间站,计划于今日中午返回东风着陆场
  • 三大白电巨头去年净利近900亿元:美的持续领跑,格力营收下滑
  • 丁俊晖连续7年止步世锦赛16强,中国军团到了接棒的时候
  • 阿里千问3系列发布并开源:称成本大幅下降,性能超越DeepSeek-R1