vue watch deep对简单值的应用

165 阅读2分钟

摘要

在使用vue watch的时候,对于deep的用法,一般都是在对对象的监听的时候,才会去使用,今天遇到一个bug,发现还可以对普通数据监听的时候使用。

起因

今天笔者在写bug的时候发现一个bug,有一个子组件,接受父组件的一个传值,获取了之后将该值截取前面两位保存为自己的一个变量(例如: '36213'前面的'36'),子组件监听该变量,并做相应的回调;

但是,当我们的父组件的传值由'36213'变成'36242'的时候,子组件里面获取到的值是'36',这时候是不会触发watch回调的,笔者想了一下,就在截取父组件的值之前,手动的将子组件的值改了一下,然后再截取父组件的值。以为已经成竹在胸了,一看,还是没watch到。。。最后,莫名其妙加了个deep才解决问题;

经过

于是,笔者做了一个测验,vue里面测验代码如下

data() {
        return {
            test: 0,
        }
    },
    watch: {
        test: {
            handler() {
                console.log(this.test, 'change')
            },
            deep: true,
        },
    },
    mounted() {
        this.init()
    },
    methods: {
        init() {
            for (let i = 0; i < 3; i++) {
                this.test += 1
            }
            for (let i = 0; i < 3; i++) {
                this.test -= 1
            }
        },
    },

我发现,当我们将test监听的deep:true注释掉的时候,控制台不会console任何东西,当我们对test监听加上deep:true的时候,控制台的console如下

image.png

结果

当我们对一个普通值快速变化并变回之前的值时,不加deep时,watcher只会惊叹一声:好快的变化。不会做任何事,加上deep才能知道该值其实已经变过一次,虽然他还是和前面长得一样。

如果大家有遇到相同的watch的情况,也可以加上deep试试。当然,源码太深奥没看