【Vue3】watch 监视多种类型数据

【Vue3】watch 监视多种类型数据

背景

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

简介

本文介绍 Vue3 中如何使用 watch 函数监视多种类型的数据。

开发环境

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

开发步骤及源码

【Vue3】watch 监视对象类型数据中的某个属性 基础上修改 Vue 根组件 App.vue 代码。

复制代码
<template>
  <div class="person">
    <h1>监视多种类型数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>电影:{{ person.film.f1 }} | {{ person.film.f2 }}</h2>
    <button @click="growUp">长大</button>
    <button @click="changeFilm">修改全部电影</button>
    <button @click="changeFilm1">修改第一部电影</button>
    <button @click="changeFilm2">修改第二部电影</button>
  </div>
</template>

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

const person = reactive({
  name: 'Harry Potter',
  age: 10,
  film: {
    f1: '哈利·波特与魔法石',
    f2: '哈利·波特与密室',
  }
})

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

function changeFilm() {
  person.film = {
    f1: '哈利·波特与阿兹卡班的囚徒',
    f2: '哈利·波特与火焰杯',
  }
}

function changeFilm1() {
  person.film.f1 = '哈利·波特与凤凰社'
}

function changeFilm2() {
  person.film.f2 = '哈利·波特与混血王子'
}

watch([() => person.age, () => person.film], (newValue, oldValue) => {
  console.log('Data changed from', oldValue, 'to', newValue)
}, {
  deep: true
})
</script>

<style scoped>
button {
  margin-right: 10px;
}
</style>

同时监视多种类型数据,只需将被监视数据包装成一个数组,将此数组作为 watch 函数的第一个参数传入。此时需要注意 watch 函数第二个参数中 newValueoldValue 的值。

从日志中可以看出,newValueoldValueProxy 对象,其中也包含一个数组,对应被监视数据的变化,可以如以下方式进行调用。

复制代码
<template>
  <div class="person">
    <h1>监视多种类型数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>电影:{{ person.film.f1 }} | {{ person.film.f2 }}</h2>
    <button @click="growUp">长大</button>
    <button @click="changeFilm">修改全部电影</button>
    <button @click="changeFilm1">修改第一部电影</button>
    <button @click="changeFilm2">修改第二部电影</button>
  </div>
</template>

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

const person = reactive({
  name: 'Harry Potter',
  age: 10,
  film: {
    f1: '哈利·波特与魔法石',
    f2: '哈利·波特与密室',
  }
})

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

function changeFilm() {
  person.film = {
    f1: '哈利·波特与阿兹卡班的囚徒',
    f2: '哈利·波特与火焰杯',
  }
}

function changeFilm1() {
  person.film.f1 = '哈利·波特与凤凰社'
}

function changeFilm2() {
  person.film.f2 = '哈利·波特与混血王子'
}

watch([() => person.age, () => person.film], (newValue, oldValue) => {
  console.log('Data changed from', oldValue, 'to', newValue)
  console.log('%s 年龄从 %d 长大到 %d', person.name, oldValue[0], newValue[0])
  console.log(person.name, '出演电影', JSON.stringify(newValue[1]))
}, {
  deep: true
})
</script>

<style scoped>
button {
  margin-right: 10px;
}
</style>
相关推荐
biyezuopinvip2 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
biyezuopinvip8 小时前
基于Spring Boot的企业网盘的设计与实现(毕业论文)
java·spring boot·vue·毕业设计·论文·毕业论文·企业网盘的设计与实现
是梦终空1 天前
计算机毕业设计264—基于Springboot+Vue3+协同过滤的房屋租赁管理系统(源代码+数据库+万字论文+设计文档)
spring boot·毕业设计·vue3·课程设计·毕业论文·协同过滤·房屋租赁管理系统
Cult Of2 天前
Alicea Wind的个人网站开发日志(2)
开发语言·python·vue
Byron07073 天前
从多端割裂到体验统一:基于 Vue 生态的跨端架构落地实战
vue·多端
Irene19913 天前
通用消息组件 bug 修复及更好的实现是使用函数调用组件
vue3·函数调用·通用消息组件
计算机程序设计小李同学3 天前
基于 Spring Boot + Vue 的龙虾专营店管理系统的设计与实现
java·spring boot·后端·spring·vue
沐墨染3 天前
Vue实战:自动化研判报告组件的设计与实现
前端·javascript·信息可视化·数据分析·自动化·vue
奔跑的呱呱牛3 天前
viewer-utils 图片预览工具库
javascript·vue·react
Cult Of3 天前
Alicea Wind的个人网站开发日志(1)
python·vue