news 2026/6/24 3:13:13

Vue3+Vite 06:计算属性 computed 与侦听器 watch

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue3+Vite 06:计算属性 computed 与侦听器 watch

一、计算属性 computed

1. 作用

基于已有的响应式数据,派生出新的计算结果,核心特性是依赖不变则结果缓存,重复使用不会重复计算,性能优于普通方法。

适合场景:需要对数据做转换、拼接、筛选,且结果会被多次使用的场景。

2. 基础用法

计算属性默认是只读的,通过return返回计算结果。最典型的场景是拼接全名:

<template> <div> <p>姓:{{ firstName }}</p> <p>名:{{ lastName }}</p> <p>全名:{{ fullName }}</p> <button @click="changeName">修改姓氏</button> </div> </template> <script setup> import { ref, computed } from 'vue' const firstName = ref('张') const lastName = ref('三') // 计算属性:依赖两个变量,自动派生全名 const fullName = computed(() => { return firstName.value + lastName.value }) const changeName = () => { firstName.value = '李' } </script>

点击按钮修改firstName后,fullName会自动重新计算并更新页面。

3. 核心特性

计算属性和普通方法最大的区别就是缓存

  • 计算属性:只要依赖的响应式数据没有变化,多次访问只会计算一次,后续直接返回缓存结果
  • 普通方法:每调用一次就执行一次,没有缓存
<template> <div> <h3>计算属性(调用3次,仅计算1次)</h3> <p>{{ fullName }}</p> <p>{{ fullName }}</p> <p>{{ fullName }}</p> <h3>普通方法(调用3次,执行3次)</h3> <p>{{ getFullName() }}</p> <p>{{ getFullName() }}</p> <p>{{ getFullName() }}</p> </div> </template> <script setup> import { ref, computed } from 'vue' const firstName = ref('张') const lastName = ref('三') // 计算属性 const fullName = computed(() => { console.log('计算属性执行了') return firstName.value + lastName.value }) // 普通方法 const getFullName = () => { console.log('普通方法执行了') return firstName.value + lastName.value } </script>

打开控制台可以看到:计算属性只打印 1 次,普通方法打印 3 次。

4. 完整写法

计算属性默认只读,特殊场景下可以配置getset实现可写,一般用于反向修改依赖数据:

<template> <div> <p>全名:{{ fullName }}</p> <button @click="setFullName">设置全名</button> </div> </template> <script setup> import { ref, computed } from 'vue' const firstName = ref('张') const lastName = ref('三') const fullName = computed({ // 读取时触发 get() { return firstName.value + lastName.value }, // 修改时触发 set(newVal) { const arr = newVal.split('') firstName.value = arr[0] lastName.value = arr.slice(1).join('') } }) const setFullName = () => { fullName.value = '李四' } </script>

二、侦听器 watch

1. 作用

监听指定的响应式数据,当数据发生变化时,执行对应的回调函数。适合处理数据变化后的副作用,比如发送请求、操作 DOM、执行异步逻辑等。

2. 基础用法

监听一个ref数据,变化时触发回调,回调函数接收新值和旧值两个参数。

<template> <div> <p>计数:{{ count }}</p> <button @click="count++">+1</button> </div> </template> <script setup> import { ref, watch } from 'vue' const count = ref(0) // 监听count变化 watch(count, (newVal, oldVal) => { console.log('新值:', newVal) console.log('旧值:', oldVal) console.log('数据变化了,执行对应操作') }) </script>

3. 监听多个数据源

可以传入数组,同时监听多个数据,任意一个变化都会触发回调:

const count = ref(0) const name = ref('张三') watch([count, name], ([newCount, newName], [oldCount, oldName]) => { console.log('count或name变化了') })

4. 深度监听 deep

当监听的是对象 / 数组时,默认只能监听到整个对象的替换,监听不到内部属性的变化,需要开启deep: true开启深度监听。

注意
  • 监听reactive定义的对象:默认自动开启深度监听,无需手动加deep
  • 监听ref定义的对象:默认浅监听,必须手动加deep: true才能监听内部属性
<template> <div> <p>姓名:{{ user.name }}</p> <button @click="changeName">修改姓名</button> </div> </template> <script setup> import { ref, watch } from 'vue' const user = ref({ name: '张三', age: 20 }) // ref对象必须加deep才能监听内部属性变化 watch(user, (newVal) => { console.log('用户信息变化了', newVal) }, { deep: true }) const changeName = () => { user.value.name = '李四' } </script>

5. 立即执行 immediate

默认watch只有数据变化时才触发,加上immediate: true后,页面初始化时就会立即执行一次回调

watch(count, (newVal) => { console.log('执行了', newVal) }, { immediate: true // 初始化立即执行一次 })

6. 监听对象的单个属性

如果只需要监听对象的某一个属性,不用监听整个对象,用函数返回指定属性即可,性能更好:

const user = reactive({ name: '张三', age: 20 }) // 只监听name属性 watch(() => user.name, (newVal) => { console.log('name变化了:', newVal) })

三、computed 与 watch 对比

特性computed 计算属性watch 侦听器
核心作用派生新数据,有返回值监听数据变化,执行副作用,无返回值要求
缓存特性支持缓存,依赖不变不重新计算无缓存,数据变化就执行
异步操作不支持(必须同步返回结果)支持(发送请求、定时器等)
使用场景数据转换、拼接、筛选数据变化后发请求、操作 DOM、执行复杂逻辑

四、总结

  1. computed:用于派生新数据,自带缓存,性能优,优先用于数据转换场景
  2. watch:用于监听数据变化执行副作用,支持深度监听、立即执行,适合异步、复杂逻辑
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 3:09:53

如何快速打造你的专属开源输入法:四叶草拼音完全指南

如何快速打造你的专属开源输入法&#xff1a;四叶草拼音完全指南 【免费下载链接】rime-cloverpinyin &#x1f340;️四叶草拼音输入方案&#xff0c;做最好用的基于rime开源的简体拼音输入方案&#xff01; 项目地址: https://gitcode.com/gh_mirrors/ri/rime-cloverpinyin…

作者头像 李华
网站建设 2026/6/24 3:08:19

【2024AI协作能力成熟度白皮书】:基于178家企业的实测数据,定义团队AI就绪度的6个硬性阈值

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI协作能力成熟度模型的理论基石与实证框架 AI协作能力成熟度模型并非凭空构建的技术评估工具&#xff0c;而是植根于人机交互理论、组织学习理论与分布式认知科学的交叉地带。其理论基石包含三个核心支柱&am…

作者头像 李华
网站建设 2026/6/24 3:08:15

实验二 shell命令与重定向 | Linux系统

实验目的1. 掌握Shell基本功能与基本概念2. 掌握Linux的基本命令实验内容一. Shell基本功能练习shell命令格式与命令行编辑特性&#xff0c;教材3.5节。练习标准流与I/O重定向&#xff1a;观察你的系统根目录下各目录的文件名、权限与属性&#xff0c;并保存结果到~/rootfile中…

作者头像 李华
网站建设 2026/6/24 3:07:23

无纺布裁切边缘整齐,使用CO2激光高效加工

无纺布加工的边缘处理行业痛点 无纺布因轻便、透气、成本低等特性&#xff0c;广泛应用于口罩、卫生用品、包装材料、农业覆盖等领域。但其纤维结构松散&#xff0c;传统加工工艺面临诸多难题&#xff1a;刀片裁切易导致边缘散丝、起毛&#xff0c;机械冲压边缘不平整且易变形&…

作者头像 李华
网站建设 2026/6/24 3:05:39

macOS窗口布局软件rectangleapp

需求&#xff1a; macOS之中&#xff0c;在一个窗口 左上角绿色按钮鼠标右键可以设置窗口的布局&#xff0c;比如&#xff1a;让窗口占满左半边。 我每次都用鼠标点感觉不太方便&#xff0c;有没有什么办法可以用快捷键实现&#xff1f; 以前我用过很长一段时间yabai&#xff0…

作者头像 李华
网站建设 2026/6/24 3:03:36

linux宝塔面板使用API自动部署更新文件

次两次更新还好,多网站,多频次更新,还是需要一个简单脚本实现自动化更新部署.2. 开启API访问登录宝塔面板,找到设置/面板设置>API接口,点击API接口配置获取接口密钥,以及配置IP白名单.配置图如下3. 访问签名处理访问接口时,需要添加签名参数,签名参数生成规是 token: md5(st…

作者头像 李华