在看Vue的API关于watch选项这里,官方教程内的代码:
var vm = new Vue({
data: {
a: 1,
b: 2,
c: 3,
d: 4,
e: {
f: {
g: 5
}
}
},
watch: {
a: function (val, oldVal) {
console.log('new: %s, old: %s', val, oldVal)
},
// 方法名
b: 'someMethod',
// 深度 watcher
c: {
handler: function (val, oldVal) { /* ... */ },
deep: true
},
// 该回调将会在侦听开始之后被立即调用
d: {
handler: function (val, oldVal) { /* ... */ },
immediate: true
},
e: [
function handle1 (val, oldVal) { /* ... */ },
function handle2 (val, oldVal) { /* ... */ }
],
// watch vm.e.f's value: {g: 5}
'e.f': function (val, oldVal) { /* ... */ }
}
})
vm.a = 2 // => new: 2, old: 1
示例中出现的 handler 这个方法是怎么来的?貌似不能用别的名称替代
可以参照源码里state.js里的这一段,Vue的类初始化建立数据绑定时,会从用户传的参数来判断拿什么来做监听的数据变量,拿什么来当作监听到数据变更后的处理函数。因为在变量后你传了一个对象,这个对象就是
createWatcher
函数参数中对应的handler,函数第一步逻辑就是判断它是不是一个对象,如果是对象,就拿它里面的handler参数来作为监听事件的处理函数,所以这个属性是必须这样写的。