Vue 词条目录
前端Wiki/Vue/基础/响应式数据

计算属性

计算属性(computed)根据响应式数据派生新值,并缓存结果:依赖不变时多次读取只算一次,依赖变了才重算。模板里写复杂表达式的地方都应该换成计算属性——模板保持简单,逻辑可复用。

与方法的区别:methods 每次渲染都重新执行,无缓存;computed 有缓存且按依赖追踪。与侦听器的区别:computed 是「派生值」,watch 是「做副作用」(发请求、改别的数据)。

  • computed 缓存:依赖不变不重算,性能优于 methods
  • 必须返回值,且不应在里做副作用(不要发请求、改依赖)
  • setter 可选:读写双向计算(如 fullName 的 get/set)
HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>计算属性</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
  <div id="app">
    <input v-model="firstName" placeholder="姓">
    <input v-model="lastName" placeholder="名">
    <p>全名:{{ fullName }}</p>
    <p>总价:{{ total }} 元(单价 {{ price }} × {{ qty }})</p>
    <button @click="qty++">加购</button>
  </div>

<script>
  const { createApp, ref, computed } = Vue;
  createApp({
    setup() {
      const firstName = ref('张');
      const lastName = ref('三');
      const price = ref(99);
      const qty = ref(2);

      // 派生值 + 缓存:firstName/lastName 不变就不重算
      const fullName = computed(() => firstName.value + lastName.value);
      const total = computed(() => price.value * qty.value);

      return { firstName, lastName, fullName, price, qty, total };
    }
  }).mount('#app');
</script>
</body>
</html>
本节要点computed = 带缓存的派生值:依赖变了才算,复杂表达式都该交给它。