首页 > 其他分享 >vue数组和对象进行 watch 和 watchEffect 对比

vue数组和对象进行 watch 和 watchEffect 对比

时间:2023-04-04 19:00:49浏览次数:48  
标签:vue console log watch watchEffect oldValue newValue

const arr1 = ref([]);
    const arr2 = reactive([]);
    const obj1 = ref({});
    const obj2 = reactive({});
    watchEffect(() => {
        console.log("watchEffect arr1", arr1.value);
        console.log("watchEffect arr2", arr2);
        console.log("watchEffect obj1", obj1.value);
        console.log("watchEffect obj2", obj2);
    });
    watch(
        arr1,
        (newValue, oldValue) => {
            console.log("watch arr1", newValue, oldValue);
        },
        {}
    );
    watch(
        arr2,
        (newValue, oldValue) => {
            console.log("watch arr2", newValue, oldValue);
        },
        {}
    );
    watch(
        obj1,
        (newValue, oldValue) => {
            console.log("watch obj1", newValue, oldValue);
        },
        {}
    );
    watch(
        obj2,
        (newValue, oldValue) => {
            console.log("watch obj2", newValue, oldValue);
        },
        {}
    );
    setTimeout(() => {
        arr1.value.push(111);
    }, 2000);
    setTimeout(() => {
        arr2.push(222);
    }, 2000);
    setTimeout(() => {
        obj1.value["aaa"] = 111;
    }, 2000);
    setTimeout(() => {
        obj2["bbb "] = 222;
    }, 2000);

以上写法,数组和对象修改,仅在 watch 的监听下, reactive定义的数组和对象可以被监听到改变

 

const arr1 = ref([]);
    const arr2 = reactive([]);
    const obj1 = ref({});
    const obj2 = reactive({});
    watchEffect(() => {
        // console.log("layerList1", layerList);
        // console.log("layerList2", layerList.value);
        // console.log("currentClickLayer111", currentClickLayer);
        console.log("watchEffect arr1", arr1.value);
        console.log("watchEffect arr2", arr2);
        console.log("watchEffect obj1", obj1.value);
        console.log("watchEffect obj2", obj2);
    });
    watch(
        arr1,
        (newValue, oldValue) => {
            console.log("watch arr1", newValue, oldValue);
        },
        { deep: true }
    );
    watch(
        arr2,
        (newValue, oldValue) => {
            console.log("watch arr2", newValue, oldValue);
        },
        { deep: true }
    );
    watch(
        obj1,
        (newValue, oldValue) => {
            console.log("watch obj1", newValue, oldValue);
        },
        { deep: true }
    );
    watch(
        obj2,
        (newValue, oldValue) => {
            console.log("watch obj2", newValue, oldValue);
        },
        { deep: true }
    );
    setTimeout(() => {
        arr1.value.push(111);
    }, 2000);
    setTimeout(() => {
        arr2.push(222);
    }, 2000);
    setTimeout(() => {
        obj1.value["aaa"] = 111;
    }, 2000);
    setTimeout(() => {
        obj2["bbb "] = 222;
    }, 2000);

以上写法,通过设置 watch 选项,deep:true,支持深度监听,ref 和 reactive 创建的对象和数组都可以被 watch 监听到

官方文档

 

总结:

watch :

通过 ref 创建的变量,如果是数组或者对象,需要增加 deep:true 来进行深度监听

通过 reactive 创建的变量,如果是数组或者对象,默认会进行深度监听

watchEffect:

不支持对象和数组的监听

 

 

标签:vue,console,log,watch,watchEffect,oldValue,newValue
From: https://www.cnblogs.com/beileixinqing/p/17287647.html

相关文章

  • 超详细!新手如何创建一个Vue项目
    目录一、在官网下载Vue.js二、使用<script>标签直接引入本地的vue.js三、使用CDN引入Vue.js四、验证是否安装成功五、安装VueDevtools浏览器调试插件不同浏览器导入方法本篇仅以HBuilderX为例,其余开发软件同样适用这里两种方法,使用<script>标签直接引入本地的vue.js或使用CDN......
  • 如何在vue3获取 DOM 元素
    获取dom的ref元素名称,要对应暴露的名称,不然会出现无效的dom报错,也就是拿到的是null在setup中,使用ref(null)获取dom不能直接在setup里面拿到dom的值,因为setup对应的生命周期是created,所以必须在后续的生命周期钩子里面拿到,比如onMounted注意:ref不要加冒号,直接写dom元素名称......
  • vue引入粒子背景图效果
    安装依赖npminstallvue-particles--save-devmain.jsimportVueParticlesfrom'vue-particles'Vue.use(VueParticles)template  <vue-particles     color="#409EFF"     :particleOpacity="0.7"     :parti......
  • Vue3——使用deep进行样式穿透的时候发出v-deep警告
    前言其实只是一个警告,如果你不在意也是可以的,不过有点强迫症就按着提示说的改了,然后又去官网看了下对应的文档;!>::v-deepusageasacombinatorhasbeendeprecated.Use:deep()instead.这里没啥好说的,因为Vue3的文档中有对应的解释组件作用域CSS了,而且就算不看文档根据提......
  • DayOne-Vue的基本使用指令以及过滤器
    一、Vue1、什么是VueVue是一个流行的JavaScript框架,用于构建用户界面。它被设计成渐进式的,可以逐步应用到现有的项目中,也可以构建全新的应用。Vue的核心库只关注视图层,因此易于集成到其他库或现有项目中。Vue具有响应式和组件化的特性,使得开发者可以更轻松地管理和维护复杂的用......
  • 使用jenkins一键打包发布vue项目
    jenkins的安装Jenkins是一款开源CI&CD软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins支持各种运行方式,可通过系统包、Docker或者通过一个独立的Java程序。安装这里的操作系统为WSLUbuntu,其它系统的安装的请参考jenkins官方文档wget-q-O-https://pkg.jenkins.......
  • vue 之 computed方法自带缓存踩坑1
    使用场景:ant-vue穿梭框使用页面使用computed方法处理组织结构数据,退出页面时,对加载数据做了setnull操作,再次进入页面时,穿梭框只显示数据,无法做左右穿梭功能。原因:computed方法在页面初始化时执行,且只执行一次,并会将方法内的数据进行缓存。退出页面做了数据清除工作,但并为清楚......
  • 项目实践后的图片压缩完整使用过程【vue3+js】
    van-uploader+图片压缩+图片base64转成file compressImage.jsconstACCEPT=['image/jpg','image/png','image/jpeg']constMAXSIZE=1024*1024*2;constMAXTIP="4"//压缩算法函数/*1.首先拿到了base64的图片字符串2.创建一个image对象,获......
  • VUE watch监听器的基本使用方法详解
    1、下面代码是watch的一种简单的用法<divid="app"><inputtype="text"v-model="firstName"/></div><scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script><script>......
  • vue 常用动画
    来源: https://juejin.cn/post/6844903638402334734Vue常用transition动画效果记录我的代码果然有问题2018年07月15日13:48 ·  阅读3839先简单介绍下transition标签的使用方法主要用于v-show,v-if或router-view的进出场动画模板<transitionn......