在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。

相关推荐
逐·風2 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫2 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦3 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子3 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山4 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享4 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果4 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄5 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
凉辰5 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
清灵xmf6 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询