【vue】有关watch的一道题


下面说法错误的是:

A watch监听对象必须设置deep:true

B 数组直接通过索引修改属性值,能触发watch方法

C watch内部可以写异步方法

D immediate:true可以开启首次赋值监听

这道题我做错了,选的A,正确答案是B。

先看B为什么错:

我们都知道数组直接以下标的方式修改数组项,data数据是无法响应式驱动视图的。


nowcoder

点击按钮并没有变成黑色

此时控制台输出arr:

这个Observer代表arr数组上有一个watch监听器。

data数据改变了,但是视图没有重新渲染,watch方法也没有被触发。

换种写法:

Vue.set(this.arr, 0, 'black');

这种方式data数据会响应式更新,结果:

     

watch方法也被触发啦!以后只要记住watch方法触发与data数据响应式更新的特点一致就行了。

然后我们再看A

比如说有这么段代码:

obj的name属性在视图上确实是更新了,但是watch方法可没有触发!

毕竟监听一个对象可比监听一个字符串或者数组难多了!它需要更深层次的监听。

所以此时就用到了'deep'这个属性,告诉watch要开启360度全方位无死角深层次监听,眼神牢牢锁定你!

既然要设置属性了,就不能用es6那种简写了,当然,也可以用啦,不过就不能直接在监听对象上用,可以在handler上用函数的简写。

watch: {
    obj: {
        deep: true,
        handler() {
            console.log('监听的对象发生了更新!')
        }
    }
}

然后,watch方法就可以触发啦!

最后再看D

immediate开启首次赋值监听,啥叫‘首次赋值’?其实就是data数据初始化,监听的数据初始化完成以后,就会调用watch方法了!

watch: {
    obj: {
        immediate: true,
        deep: true,
        handler() {
            console.log('首次赋值监听!')
        }
    }
}