【Vue3】watch 监视 ref 定义的数据

【Vue3】watch 监视 ref 定义的数据

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 Vue3 中如何使用 watch 函数监视 ref 定义的数据。

开发环境

分类 名称 版本
操作系统 Windows Windows 11
IDE Visual Studio Code 1.91.1

开发步骤及源码

1> 创建 Vue3 工程,参考:【Vue3】工程创建及目录说明。

2> 删除 src 目录下 assets 和 components 目录。

3> 修改 src 目录下 main.ts。

复制代码
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

4> 重写 Vue 根组件 App.vue,监视 ref 定义的基本类型数据。

复制代码
<template>
  <div class="person">
    <h1>监视 ref 定义的基本类型数据</h1>
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }}</h2>
    <button @click="growUp">长大</button>
  </div>
</template>

<script setup lang="ts" name="App">
import { ref, watch } from 'vue'

const name = ref('Harry Potter')
const age = ref(10)

function growUp() {
  age.value += 1
}

// 监视
const stopWatch = watch(age, (newValue, oldValue) => {
  console.log('%s 又长大一岁,从 %d 岁到 %d 岁', name.value, oldValue, newValue)
  if (newValue >= 18) {
    console.log('%s 成人了,可以不用再监护了', name.value)
    stopWatch()
  }
})
</script>

<style scoped></style>

5> 执行 npm run dev 命令启动应用,浏览器访问 http://localhost:5173/,点击页面中 长大 功能按钮,观察日志打印。

6> 重写 Vue 根组件 App.vue,监视 ref 定义的对象类型数据。

复制代码
<template>
  <div class="person">
    <h1>监视 ref 定义的对象类型数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="growUp">长大</button>
    <button @click="replace">换人</button>
  </div>
</template>

<script setup lang="ts" name="App">
import { ref, watch } from 'vue'

const person = ref({
  name: 'Harry Potter',
  age: 10,
})

function growUp() {
  person.value.age += 1
}

function replace() {
  person.value = {
    name: '赫敏·格兰杰',
    age: 11,
  }
}

// 监视
const stopWatch = watch(person, (newValue, oldValue) => {
  console.log('人员信息变更,从 %o 变成 %o', oldValue, newValue)
  if (newValue.age >= 18) {
    console.log('%s 成人了,可以不用再监护了', person.value.name)
    stopWatch()
  }
}, {
  deep: true
})
</script>

<style scoped></style>

7> 执行 npm run dev 命令启动应用,浏览器访问 http://localhost:5173/,点击页面中 长大 和 换人 功能按钮,观察日志打印。

参数说明

watch 函数参数包括:

  • 参数一:监视的数据源,本示例中是 ref 定义的基本类型或对象类型数据。
  • 参数二:监视的数据源发生变化时触发的回调函数,此回调函数含 2 个参数:
    • 参数一:监视数据源变化后的新值。
    • 参数二:监视数据源变化前的旧值。
  • 参数三:监视配置对象,包括:
    • deep: true:开启深度监视,监视 ref 定义的对象类型数据时,只有开启了深度监视,才能在对象属性发生变化时触发回调。
    • immediate: true:watch 默认是懒执行的,仅当数据源变化时才会执行回调,使用此配置可以在创建监视器时立即执行一次回调。
    • once: true:watch 默认是每次数据源变化都会触发回调函数的执行,使用此配置在数据源变化时仅触发一次。
相关推荐
卋罖7505 小时前
Razor 视图 + JavaScript + Vue/iView 组件实现的表格自定义列
javascript·vue·iview·razor视图
RuoyiOffice16 小时前
Vue3+Gantt:把任务排期、依赖关系和里程碑放进项目管理
项目管理·vue3·springboot·dhtmlx-gantt·wbs·gantt·ruoyi office
AI开源软件3 天前
SpringBoot3+Vue3 财务管理系统如何设计:从业务单据到总账的模块划分
spring boot·vue3·领域建模·会计凭证·ruoyi office·业财协同·财务系统设计
无所谓^_^3 天前
个人健康管理系统 | Springboot3 | Vue3
java·vue·毕业设计·springboot·课程设计·毕设·前后端分离
在努力的前端小白4 天前
基于FastAPI+LangChain+LangGraph+Agent+多模态的AI Agent 有渔渔具网站
人工智能·langchain·vue·fastapi
sun_weitao4 天前
用 FastAPI + MQTT 做一个 ESP32最小化跑通示例
中间件·vue·fastapi
我不会起名字3226 天前
Redis 从 0 到 1(十三):分布式锁被误删、锁不住?Go 无 Lua 实现 3 级防御
redis·go·分布式锁·watch·setnx
Nymph_Zhu7 天前
vue3+element-plus 文件上传
前端·typescript·vue3·element-plus
Nymph_Zhu7 天前
pdf转换markdown预览及内容互相点击定位
前端·pdf·vue3·markdown·element-plus
汤米粥8 天前
2026年主流前端技术框架
vue·react·elementplus·tailwind css·angular‌·svelte‌·bootstrap‌