vue computed 和 watch

‌computed 和 ‌watch 是 Vue.js 中处理数据变化的两种核心机制,‌核心区别在于计算方式与适用场景‌:computed 用于缓存派生值,watch 用于响应数据变化的异步或副作用操作。‌‌

核心区别:

缓存机制
  • computed 依赖不变时复用‌缓存结果,避免重复计算。‌‌
  • watch 每次数据变化都会触发‌回调,无缓存机制。‌‌
异步支持
  • computed 不支持异步操作,内部异步代码无效。‌‌
  • watch 支持异步操作(如 ‌API 请求)。‌‌
返回值要求
  • computed 必须通过 ‌return 返回值。‌‌
  • watch 无需返回值,直接执行‌回调逻辑。‌‌
初始化行为
  • computed 首次加载自动计算并缓存。‌‌
  • watch 默认首次不触发,需设置 immediate: true 才初始化执行。‌‌
适用场景
  • ‌优先用 ‌computed‌。

当属性由多个数据派生时(如购物车总价),或需避免重复计算的场景。‌‌

  • ‌选择 ‌watch‌。

当数据变化需执行异步操作(如‌搜索请求)、‌复杂副作用,或监听非 Vue 数据源(如 ‌URL 变化)时。‌‌

底层原理

两者均基于 Vue ‌响应式系统:

computed 通过‌依赖收集实现‌懒更新,依赖不变时复用缓存。‌‌

watch 通过‌深度监听(deep: true)或‌精确监听触发回调,但性能消耗较高。‌‌

computed 示例:

复制代码
<template>
  姓:<input v-model="firstName">
<br/>
  名:<input v-model="lastName">
  <br/>
  全名:<span> {{ fullName }}</span>
  <br/>
  <button @click="handleClick">修改全名</button>
</template>

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

let firstName = ref('zhang');
let lastName = ref('san');
/* //计算属性------只读取,不修改
let fullName = computed(()=>{
    return firstName.value + '-' + lastName.value
  }) */

 // 计算属性------既读取又修改
  let fullName = computed({
    // 读取
    get(){
      return firstName.value.slice(0,1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value
    },
    // 修改
    set(val){
      console.log('有人修改了fullName',val)
      firstName.value = val.split('-')[0]
      lastName.value = val.split('-')[1]
    }
  })

  function handleClick(){
    fullName.value = 'xiao-ming'
  } 
</script>
相关推荐
程序员爱钓鱼6 分钟前
Rust Associated Type关联类型详解:为Trait定义内部类型
前端·后端·rust
zh_xuan1 小时前
个人主页左侧菜单支持分组,以及菜单显示和隐藏
前端·javascript·css
Ming_studying1 小时前
HTML + CSS + JavaScript实现可视化JSON工具:格式化、折叠、搜索与错误定位
javascript·css·html·json·数据可视化·web工具
Emily156853598704 小时前
Emerson 1C31129G03 Analog Input Module
java·开发语言·前端·plc·emerson·1c31129g03·input module
To_OC9 小时前
面试被问了三回三栏布局,这次我终于把 BFC 那层窗户纸捅破了
前端·css·面试
To_OC9 小时前
啃完 TS 工具类型我发现:Pick 和 Omit 原来就是一层窗户纸
前端·面试·typescript
风月说与山鬼11 小时前
三、大括号语法
前端·react.js
kyriewen11 小时前
我把最常踩的8个CORS跨域报错整理了一遍——第8个去年还不存在
前端·javascript
Csvn12 小时前
🕰️ 闭包 + setTimeout 的 5 个经典陷阱:为什么定时器看到的永远不是最新的值?
前端