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>
相关推荐
一孤程14 分钟前
Airtest自动化测试第五篇:小程序与Web测试——跨平台自动化全覆盖
前端·自动化测试·小程序·自动化·测试·airtest
IT_陈寒16 分钟前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
yume_sibai1 小时前
大屏数据可视化 - 边框红绿呼吸灯实现详解
前端·信息可视化·typescript
竹林8181 小时前
从 ethers.js 迁移到 Viem:一个签名验证 Bug 让我彻底放弃旧爱
javascript
Hyyy2 小时前
很多Desktop都在上的Computer Use是什么
前端·llm
慢功夫2 小时前
开篇:VS Code 为什么不是一个普通 React App
前端·visual studio code
你挚爱的强哥2 小时前
Vue2 实现 1.5s 十连击监听(连续点击若干次),封装通用可复用点击检测工具,不用 data!Vue 封装通用连击监听方法,支持自定义时长与点击次数
前端·javascript·vue.js
半个落月2 小时前
用 LangChain.js 手写一个能读写文件和执行命令的 Mini Cursor
javascript·人工智能·后端
天外天-亮2 小时前
HBuilder X 使用 uview-plus 方式
开发语言·javascript·hbuilder x·uview-plus
huashengzsj3 小时前
Shopify个人建站如何搭建独立站:从零开始的完整指南
前端·网络·人工智能