Vue.js 中的 $watch使用方法
内容摘要
这篇文章主要为大家详细介绍了Vue.js 中的 $watch使用方法,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
这两天学习了Vue.js 中的 $wat
对此感兴趣的朋友,看看idc笔记做的技术笔记!
这两天学习了Vue.js 中的 $wat
文章正文
这篇文章主要为大家详细介绍了Vue.js 中的 $watch使用方法,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
这两天学习了Vue.js 中的 $watch这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。
【图片暂缺】
github 源码
Observer, Watcher, vm 可谓 Vue 中比较重要的部分,检测数据变动后视图更新的重要环节。下面我们来看看 如何实现一个简单的 $watch 功能,当然Vue 中使用了很多优化手段,在本文中暂不一一讨论。
例子:
代码如下:
// 创建 vm
let vm = new Vue({
data: 'a'
})
// 键路径
vm.$watch('a.b.c', function () {
// 做点什么
})
先阐明在这个 demo 以及Vue 中,它们的关系:
vm 调用 $watch 后,首先调用 observe 函数 创建 Observer 实例观察数据,Observer 又创建 Dep , Dep 用来维护订阅者。然后创建 Watcher 实例提供 update 函数。一旦数据变动,就层层执行回调函数。
【图片暂缺】
Observer和observe
递归调用 observe 函数创建 Observer。在创建 Observer 的过程中,使用 Object.defineProperty() 函数为其添加 get set 函数, 并创建 Dep 实例。
代码如下:
export function observe (val) {
if (!val || typeof val !== 'object') {
return
}
return new Observer(val)
}
代码如下:
function defineReactive (obj, key, val) {
var dep = new Dep()
var property = Object.getOwnPropertyDescriptor(obj, key)
// 是否允许修改
if (property && property.configurable === false) {
return
}
// 获取定义好的 get set 函数
var getter = property && property.get
var setter = property && property.set
var childOb = observe(val)
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: () => {
var value = getter ? getter.call(obj) : val
// 说明是 Watcher 初始化时获取的, 就添加订阅者
if (Dep.target) {
dep.depend()
if (childOb) {
childOb.dep.depend()
}
// if isArray do some....
}
return value
},
set: (newVal) => {
var value = getter ? getter.call(obj) : val
if (value === newVal) {
return
}
if (setter) {
setter.call(obj, newVal)
} else {
val = newVal
}
childOb = observe(newVal)
dep.notify()
}
})
}
你可能会疑问 Dep.target 是个什么鬼?
注:关于Vue.js 中的 $watch使用方法的内容就先介绍到这里,更多相关文章的可以留意
代码注释