vue watch对于对象和基本类型重复赋值的研究

911 阅读1分钟
  • 我们知道vue对数据是做了响应式处理的,即设置值是会触发相关动作的
  • 于是想当然觉得watch一个改变为原来值的能够监听到,但事实是监听不到
  • 问题1:为什么会监听不到?
  • 问题2:一个对象的属性赋值重复的值,这个对象能否watch到呢?
研究
我们打印this,然后查看$data。找到对应属性,查看其set
// 结构大概如下
set basicData: ƒ reactiveSetter(newVal)
arguments: (...)
caller: (...)
length: 1
name: "reactiveSetter"
prototype: {constructor: ƒ}
__proto__: ƒ ()
[[FunctionLocation]]: vue.runtime.esm.js?2b0e:1037

// 点 vue.runtime.esm.js?2b0e:1037 进去查看代码
可以发现
--------------------------------------------
if (newVal === value || (newVal !== newVal && value !== value)) {
  return
}
// 也就是基本数据类型或者NaN赋值为自身,则不会走到下面的notify
// 也就是不会触发watch

// 由于deep:true的作用是递归子属性,然后子属性notify触发父属性
// 由此可知,一个对象的属性改变为自身,对该对象deep监听也是监听不到的