Vue中computed、method的区别

Computed 的核心是"计算缓存":

  • 用于基于响应式数据计算新值

  • 有缓存机制,依赖不变就不重新计算

  • 计算结果是响应式的(依赖变化会自动更新)

  • 适合模板中频繁使用的计算结果

method 普通方法

  • 普通函数,没有响应式特性

  • 每次调用都会执行

  • 适合事件处理、需要参数的操作

案例

使用方法拼接姓名

javascript 复制代码
<script setup>

import {computed, ref, watch} from "vue";
const firstName = ref("liu");
const lastName = ref("kang");

const fullName = () => {
  console.log("执行方法")
  return firstName.value + " " + lastName.value;
};
</script>

<template>
  全名:{{fullName()}}<br>
  全名:{{fullName()}}<br>
</template>

<style scoped>

</style>

控制台:

可见方法被调用几次就执行几次

使用计算属性拼接姓名

javascript 复制代码
<script setup>

import {computed, ref, watch} from "vue";
const firstName = ref("liu");
const lastName = ref("kang");
const fullName = computed(() => {
  console.log("执行computed")
  return firstName.value + " " + lastName.value;
});

</script>

<template>
  全名:{{fullName}}<br>
  全名:{{fullName}}<br>
</template>

<style scoped>

</style>

控制台:

在依赖并未发生改变的情况下,只执行一次计算属性

如果依赖发生改变的情况:

javascript 复制代码
<script setup>

import {computed, ref, watch} from "vue";
const firstName = ref("liu");
const lastName = ref("kang");
const fullName = computed(() => {
  console.log("执行computed")
  return firstName.value + " " + lastName.value;
});

</script>

<template>
  全名:{{fullName}}<br>
  全名:{{fullName}}<br>
  姓:<input type="text" v-model="firstName"/><br>
  名:<input type="text" v-model="lastName"/>
</template>

<style scoped>

</style>

一开始进入页面,执行一次computed

当依赖发生改变时,立马再次执行computed计算最新的值,改变一次重新计算一次

计算属性是否可以传参?

计算属性不可以传参,以下代码时错误用法:

javascript 复制代码
computed: {
  // 这是错误的!计算属性不能定义参数
  getItemPrice(item) {  // ❌ 不能这样写
    return item.price * this.taxRate
  }
}

// 模板中也不能传参
{{ getItemPrice(item) }}  // ❌ 不工作

如果想要传入参数,可以"曲线救国":

javascript 复制代码
// Vue3 组合式API
import { computed } from 'vue'

// 返回一个函数,该函数可以接收参数
const getItemPrice = computed(() => {
  // 返回一个函数,这个函数可以接收参数
  return (item) => {
    return item.price * taxRate.value
  }
})

// 使用
<template>
  <div v-for="item in items" :key="item.id">
    价格: {{ getItemPrice(item) }}
  </div>
</template>
相关推荐
console.log('npc')17 分钟前
第 1 章 项目概述与环境搭建
前端·人工智能·大模型
定栓18 分钟前
Webpack迁到Vite第七节(二):全家桶移除 — Babel 全家桶深度分析
前端·webpack·node.js
IT_陈寒26 分钟前
React组件莫名重渲染?你可能忘了这个小细节
前端·人工智能·后端
鶴哥只手遮天37 分钟前
React 19.3.1 源码深度剖析-第 12 章(下)RSC 与 Flight 协议
前端·react.js·开源
deli00738 分钟前
TCP 三次握手到底发几个包?丢包重传动画实测一遍
前端
盟接之桥1 小时前
盟接之桥谈线束数字化-按单入按单出:线束企业库存管理的破局之道
大数据·前端·网络·数据库·人工智能·制造
巴勒个啦1 小时前
Prompt Engineering 实战:5 个让 AI 生成生产级业务代码的工程模式
java·前端
去伪存真1 小时前
AI时代,古法编程的码农路在何方?
前端
计算机魔术师1 小时前
从7月绕过沙盒到9月再曝违规,OpenAI的AI安全防线在漏什么
前端
我的div丢了肿么办1 小时前
element-plus表格使用:filter-method过滤导致出现无数据
前端·javascript·vue.js