在vue3中如何使用watch举例(情况三)

一、作用

监视数据的变化(和vue2中watch作用一致)

二、特点

vue3中的watch只能监视以下四种数据:

  1. ref定义的数据
  2. reactive定义的数据
  3. 函数返回一个值(getter函数)
  4. 一个包含上述内容的数组

情况三:监听响应式对象的某一个属性值(函数返回一个值)

(1)监听响应式对象的某一个基本数据类型的属性值

js 复制代码
<template>
    <div>
        <h1>找对象</h1>
        <h2>姓名: {{ person.name }}</h2> <br>
        <h2>年龄: {{ person.age }}</h2>  <br>
        <h2>第一台车: {{ person.car.car1 }}</h2>
        <h2>第二台车: {{ person.car.car2 }}</h2>
        <button @click="changeName">修改名字</button>
        <button @click="changeCar1">修改第一台车</button>
        <button @click="changeCar">修改所有车</button>
    </div>
    </template>
    
    <script setup lang="ts">
    //引入watch
    import { reactive, watch } from 'vue'
    let person = reactive({
        name: '胡歌',
        age: 25,
        car: {
            car1: '奔驰A6',
            car2: '宝马x5'
        }
    })
    //只修改person内部的name属性
    function changeName() {
        person.name = '彭于晏'
    }
    //监听响应式对象的某个属性值,若该属性值不是对象属性,需要写成函数形式。
    watch(() => person.name, (newValue, oldValue)=> {
        console.log('换对象名字被监听了',newValue, oldValue)
    })
    </script>

此时watch只会监听person下面的name变化,因为name是一个基本数据类型,所以必须写成函数形式,且返回一个值,这个值就是要监听的name。

(2)监听响应式对象的某一个对象类型的属性值

js 复制代码
<template>
    <div>
        <h1>找对象</h1>
        <h2>姓名: {{ person.name }}</h2> <br>
        <h2>年龄: {{ person.age }}</h2>  <br>
        <h2>第一台车: {{ person.car.car1 }}</h2>
        <h2>第二台车: {{ person.car.car2 }}</h2>
        <button @click="changeName">修改名字</button>
        <button @click="changeCar1">修改第一台车</button>
        <button @click="changeCar">修改所有车</button>
    </div>
    </template>
    
    <script setup lang="ts">
    //引入watch
    import { reactive, watch } from 'vue'
    let person = reactive({
        name: '胡歌',
        age: 25,
        car: {
            car1: '奔驰A6',
            car2: '宝马x5'
        }
    })
    //修改第一台车
    function changeCar1 () {
        person.car.car1 = '小米su7'
    }
    //修改所有车
    function changeCar () {
        person.car =  {
            car1: '海豹',
            car2: '沃尔沃s90'
        }
    }
    //监听响应式对象的某个属性值,若该属性值是对象属性,可直接写属性值
    watch( person.car, (newValue, oldValue)=> {
        console.log('换轿车被监听了',newValue, oldValue)
    })

    </script>

因为监听的属性是一个对象,那么可以直接person.car,但是点击修改第一台车,watch会监听,但点击修改所有车,watch不会监听,如果想要全部都监听到,那必须写成函数形式:

js 复制代码
    //监听响应式对象的某个属性值,若该属性值是对象属性,也可写成函数形式,但建议写成函数形式。
    watch(() => person.car, (newValue, oldValue)=> {
        console.log('换轿车被监听了',newValue, oldValue)
    }, {deep: true})

此时看到控制台,不管是修改第一台车,还是修改所有车,watch都能监听到,但前提是必须加watch的第三个参数,deep为true,意思是开启深度监听。如果不加深度监听,那么watch只会监听修改所有车,那就是值监听这个属性本身。

总结

若想监听某个响应式对象的属性值,不管这个属性值是基本数据类型还是对象数据类型,都建议写成函数形式;如果需要关注对象内部,则手动开启深度监听,则加一个deep:true。

相关推荐
程序媛-徐师姐3 分钟前
Java 基于SpringBoot+vue框架的老年医疗保健网站
java·vue.js·spring boot·老年医疗保健·老年 医疗保健
yngsqq4 分钟前
c#使用高版本8.0步骤
java·前端·c#
Myli_ing39 分钟前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风41 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
PandaCave1 小时前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习
软件小伟1 小时前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾1 小时前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧1 小时前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm1 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
chusheng18402 小时前
Java项目-基于SpringBoot+vue的租房网站设计与实现
java·vue.js·spring boot·租房·租房网站