Vue3 中的 监视 watch

1.定义

        与Vue2 中的监视功能一致,.当监视的属性发生变化时,回调函数会自动调用,进行相关操作,Vue3 中的监视 watch 为一个函数

2.watch的使用

        watch的功能配置项有:immediate: true,deep:true  等等

        注意:功能配置项是一个对象

        1.使用前引入组合式的API watch

import {watch} from 'vue'

         2.watch 函数中的参数

                参数一: 要监视的响应式数据

                参数二:监视的回调函数

                参数三:监视的配置

        2.使用 watch 所出现的情况

                情况一:

                        watch 监视一个 ref 所定义的响应式数据

                        语法:watch(要监视的属性, (newValue, oldValue) => {......}, {功能配置项})

                        具体代码实现:

watch(num,(newValue, oldValue) => console.log('num发生了变化',newValue, oldValue ))

                情况二:

                        watch 监视多个 ref 所定义的响应式数据

                        语法:watch([要监视的属性合集], (newValue, oldValue) => {......}, {功能配置项})

                        具体代码实现:

 watch([num, msg], (newValue, oldValue) => console.log('num或msg发生了变化', newValue, oldValue ), {immediate: true})

                情况三:

                        watch 监视一个 reactive 所定义的响应式数据

                        语法:watch(要监视的属性, (newValue, oldValue) => {......}, {功能配置项})

                        注意:

                                1.这里无法正确获取 oldValue

                                2.这里强制开启 深度监视 (deep 配置无效)

                        具体代码实现:

watch(person, (newValue, oldValue) => console.log('person中的 name 或 age 发生了变化',newValue,oldValue ))

                情况四:

                        watch 监视一个 reactice 所定义的响应式数据中的某个属性

                        语法:watch(() => perosn.要监视的person中的某个属性, (newValue, oldValue) => {......},{功能配置项})

                        注意:监视 reactice 所定义的响应式数据中的某个属性时,watch 中的第一个参数为一个函数,返回值为要监视的属性

                        具体代码实现:

watch(() => person.name, (newValue, oldValue) => console.log(newValue, oldValue))

                情况五:

                        watch 监视一个 reactive 所定义的响应式数据中的某些属性

                        语法:watch([() => perosn.要监视的person中的某个属性, () => perosn.要监视的person中的某个属性], (newValue) => {......}, {功能配置项})

                        注意:监视 reactice 所定义的响应式数据中的某个属性时,watch 中的第一个参数为一个数组,数组中的存放着回到函数,返回值为要监视的属性

                        具体代码实现:

watch([() => person.name, () => person.age], (newValue, oldValue) => console.log(newValue, oldValue))

                情况六:

                        watch 监视一个 reactive 所定义的响应式数据中的某个属性,该属性是一个对象

                        语法:watch(() => perosn.要监视的person中的某个属性, (newValue, oldValue) => {......},{deep: true})

                        注意:

                                1.这里需要开启深度监视才可以监视到该属性中的里面值的改变

                                2.这里无法正确获取 oldValue

                        具体代码实现:

            watch(() => person.job, (newValue, oldValue) => console.log(newValue, oldValue), {deep: true})

3.两个小坑:

        1. 监视 reactive 定义的响应式数据时:oldValue 无法正确获取,强制开启了深度监视(deep 配置监视无效)

        2. 监视 reactive 定义的响应式数据中的某个属性(该属性是一个对象)时:需要开启深度监视,deep: true

4.完整代码展示:

<template>
  <h3>当前和为:{{ num }}</h3>
  <button @click="num++">点击num++</button>
  <h3>当前信息为:{{ msg }}</h3>
  <button @click="msg += '!'">点击更改信息</button>
  <hr>
  <h3>姓名:{{ person.name }}</h3>  
  <button @click="person.name += '?'">点击更改姓名</button>
  <h3>年龄:{{ person.age }}</h3>
  <button @click="person.age++">点击年龄加一</button>
  <h3>薪资:{{ person.job.j1.salary }}K</h3>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>

<script>    
    // 引入 recative 函数
    import {reactive, computed, ref, watch} from 'vue'
    export default {
        name: 'Demo',
         // vue3 配置
        setup() {
            // 数据
            let num = ref(18)
            let msg = ref('你好啊')

            let person = reactive({
                name: '张三',
                age: 18,
                job: {
                    j1: {
                        salary: 20,
                    }
                }
            })

            // watch 为一个函数,函数可以传递三个参数
            // 参数一: 要监视的响应式数据
            // 参数二:监视的回调函数
            // 参数三:监视的配置
        
            // 情况一
            // watch 监视一个 ref 所定义的响应式数据 
            // watch(num,(newValue, oldValue) => console.log('num发生了变化',newValue, oldValue ))

            // 情况二
            // watch 监视多个 ref 所定义的响应式数据
            watch([num, msg], (newValue, oldValue) => console.log('num或msg发生了变化', newValue, oldValue ), {immediate: true})

            // 情况三
            // watch 监视一个 reactive 所定义的响应式数据
            // 注意:这里无法正确获取 oldValue
            // 注意:强制开启 深度监视 (deep 配置无效)
            // watch(person, (newValue, oldValue) => console.log('person中的 name 或 age 发生了变化',newValue,oldValue ))

            // 情况四
            // watch 监视一个 reactice 所定义的响应式数据中的某个属性
            // watch(() => person.name, (newValue, oldValue) => console.log(newValue, oldValue))

            // 情况五
            // watch 监视一个 reactive 所定义的响应式数据中的某些属性
            // watch([() => person.name, () => person.age], (newValue, oldValue) => console.log(newValue, oldValue))

            // 情况六
            // watch 监视一个 reactive 所定义的响应式数据中的某个属性,该属性是一个对象
            // 注意:若监视一个 reactive 所定义的响应式数据中的某个属性,该属性是一个对象,需要开启深度监视,深度监视配置有效
            // 注意:这里无法正确获取 oldValue
            watch(() => person.job, (newValue, oldValue) => console.log(newValue, oldValue), {deep: true})


            // 返回数据
            return {
                num,
                msg,
                person
            }

        }
    }
</script>

<style>

</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3,使用watch进行深度监视可以通过设置deep选项为true来实现。默认情况下,Vuewatch只会监测对象的一层属性变化,而不会监测对象内部的值变化。但是可以通过设置deep选项为true来开启深度监视,以监测对象内部值的改变。 举例来说,假设我们有以下数据结构: ``` data: { numbers: { a: 1, b: 1, c: { d: { e: 100 } } } } ``` 如果我们想要监视多级结构所有属性的变化,我们可以使用watch,并将deep选项设置为true,如下所示: ``` watch(numbers, { deep: true }, (newValue, oldValue) => { console.log('numbers发生了变化', newValue, oldValue); }) ``` 通过这样的设置,当numbers对象内部的任何属性发生变化时,都会触发watch的回调函数,并输出新值和旧值。 需要注意的是,深度监视可能会对性能产生一定的影响,因此在使用watch时要根据数据的具体结构,决定是否采用深度监视。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue使用watch深度监视](https://blog.csdn.net/weixin_46724415/article/details/121665562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【Vue3】Vue3监视watchwatchEffect使用(图文+代码)](https://blog.csdn.net/dxnn520/article/details/126463831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值