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>
相关推荐
螺丝钉tina19 小时前
[Playwright][01] 从 Puppeteer 到 Playwright:为什么选择 Playwright + TypeScript?
前端·javascript·typescript
大团米线19 小时前
vite多环境合并打包config
javascript·vue.js·ecmascript
Sailing19 小时前
🚀🚀【封闭结束6】Agent 会话服务与鉴权上下文
前端·人工智能·agent
程序员大阳19 小时前
副队长JavaScript教程(57)-DOM事件机制
javascript·键盘事件·dom·鼠标·事件·绑定·冒泡
IT_陈寒19 小时前
Java项目实战经验分享:一次由JPA懒加载引发的生产事故
前端·人工智能·后端
环境栈笔记19 小时前
浏览器多开同步怎么做?先分清设置、登录态和窗口操作
前端·人工智能·后端·自动化
是立不是利19 小时前
CSS 的层叠与优先级——为什么我的样式不生效
前端·css
开开心心就好19 小时前
电脑语音实时转文字工具,会议记录很省事
运维·服务器·前端·c#·ocr·perl·1024程序员节
aixingpan19 小时前
aixingpan.cn API开发文档:api_docs_onechart_marks_secondary2接口指南
前端·php
唔6620 小时前
在透镜圆正中加了一个描边空心字
前端·javascript