VUE框架Vue3下使用watch监听reactive下的数据变化------VUE框架

<template>
    <h1>{{ data.counter }}</h1>
    <button @click="data.counter++">按一下加一</button>
    <h1>{{ data.a.b.c.d.counter1 }}</h1>
    <button @click="data.a.b.c.d.counter1++">按一下加一</button>
</template>

<script>
import { reactive,watch } from 'vue'
export default {
    name : "App",
    setup(){
        let data = reactive({
            counter : 1,
            a : {
                b : {
                    c : {
                        d: {
                            counter1 : 100
                        }
                    }
                }
            }
        });
        // 对于reactive监视的属性来说,默认就是开启深度监视的
        // 如果需要针对对象的某属性,那就只指定这个属性即可
        watch(data,(newValue,oldValue) => {
            // 对于reactive来说,新的可以获取,老的获取不了
            console.log("我是新的"+newValue+"我是旧的"+oldValue);
            // newValue可以获取,但是old获取不了
        },{immediate:true});

        // 如果我们只需要侦听一个属性,我们就写一个函数,只侦听那一个属性即可
        // 因为我们最后获取的是一个基本数据类型的值,所以不能直接指向它,必须是以函数的形式返回
        // 除非那个是一个响应式的对象
        watch(()=>{return data.counter},(newValue,oldValue) => {
            console.log("我是新的"+newValue+"我是旧的"+oldValue);
        },{immediate:true});
        watch(()=>data.a.b.c.d.counter1,(newValue,oldValue)=>{
            console.log("我是新的"+newValue+"我是旧的"+oldValue);
        },{immediate:true});
        // 监听数组的方式
        watch([()=>data.counter,()=>data.a.b.c.d.counter1],(newValue,oldValue)=>{
            console.log("我是新的"+newValue+"我是旧的"+oldValue);
        },{immediate:true});
        return {data};
    }
}
</script>

<style>

</style>

<template>

    <h1>{{ data.counter }}</h1>

    <button @click="data.counter++">按一下加一</button>

    <h1>{{ data.a.b.c.d.counter1 }}</h1>

    <button @click="data.a.b.c.d.counter1++">按一下加一</button>

</template>

<script>

import { reactive,watch } from 'vue'

export default {

    name : "App",

    setup(){

        let data = reactive({

            counter : 1,

            a : {

                b : {

                    c : {

                        d: {

                            counter1 : 100

                        }

                    }

                }

            }

        });

        // 对于reactive监视的属性来说,默认就是开启深度监视的

        // 如果需要针对对象的某属性,那就只指定这个属性即可

        watch(data,(newValue,oldValue) => {

            // 对于reactive来说,新的可以获取,老的获取不了

            console.log("我是新的"+newValue+"我是旧的"+oldValue);

            // newValue可以获取,但是old获取不了

        },{immediate:true});

        // 如果我们只需要侦听一个属性,我们就写一个函数,只侦听那一个属性即可

        // 因为我们最后获取的是一个基本数据类型的值,所以不能直接指向它,必须是以函数的形式返回

        // 除非那个是一个响应式的对象

        watch(()=>{return data.counter},(newValue,oldValue) => {

            console.log("我是新的"+newValue+"我是旧的"+oldValue);

        },{immediate:true});

        watch(()=>data.a.b.c.d.counter1,(newValue,oldValue)=>{

            console.log("我是新的"+newValue+"我是旧的"+oldValue);

        },{immediate:true});

        // 监听数组的方式

        watch([()=>data.counter,()=>data.a.b.c.d.counter1],(newValue,oldValue)=>{

            console.log("我是新的"+newValue+"我是旧的"+oldValue);

        },{immediate:true});

        return {data};

    }

}

</script>

<style>

</style>

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 中,可以使用 `watchEffect` 或 `watch` 来监听 `v-for` 循环的数据。这两个函数都可以实现响应式地监听数据变化的效果。 下面是使用 `watchEffect` 监听 `v-for` 循环的数据的示例代码: ```html <template> <div v-for="(item, index) in list" :key="index">{{ item }}</div> </template> <script> import { reactive, watchEffect } from 'vue'; export default { setup() { const state = reactive({ list: ['a', 'b', 'c'], }); watchEffect(() => { console.log(state.list); // 监听 state.list 的变化 }); return { list: state.list, }; }, }; </script> ``` 使用 `watch` 监听 `v-for` 循环的数据也类似,只需要将 `watchEffect` 替换为 `watch` 即可。不过需要注意,由于 `watch` 是基于依赖项进行监听的,因此需要将 `v-for` 循环的数据作为依赖项传递给 `watch`。 ```html <template> <div v-for="(item, index) in list" :key="index">{{ item }}</div> </template> <script> import { reactive, watch } from 'vue'; export default { setup() { const state = reactive({ list: ['a', 'b', 'c'], }); watch( () => state.list, // 依赖项 (newVal, oldVal) => { console.log(newVal); // 监听 state.list 的变化 } ); return { list: state.list, }; }, }; </script> ``` 需要注意的是,由于 Vue3 中的 `v-for` 指令已经被优化,因此默认情况下不会将循环变量暴露到上下文中。为了让循环变量能够在 `setup` 函数中使用,需要将其手动暴露到上下文中,例如上面示例代码中的 `return { list: state.list }`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值