如何让数据变为可响应式的?
思路:getter和setter进行劫持,每次取值的时候收集依赖,即当前所运行的环境(在哪个渲染函数中使用)。每次重新设值的时候执行依赖的回调,将渲染函数中的数据对应更新。
watcher(监听者)都干了哪些事情?
* 将当前包含了渲染函数的watcher实例放到dep.target中,执行watcher实例中的渲染函数(这很重要,watcher因为包含了渲染函数,才能实现响应式),执行渲染函数,因为引用了数据,所以会触发数据对应的getter操作。
* getter操作会干什么?getter操作会将dep.target收集起来(上面提到,dep.target就是包含了渲染函数的watcher实例),添加到一个叫deps的Set集合中。
* 此时渲染函数渲染出画面。dep.target变为null(因为画面已经渲染出来了嘛(渲染出来说明渲染函数的watcher实例已经添加到依赖deps中了!),不需要在进行依赖收集了)
至此,初次渲染完成。
如果数据变化,画面中的数据如何跟着更新?
* 数据变化会发生什么?前面讲了会触发setter,而setter做的事情就是执行依赖回调(执行依赖回调前新值覆盖旧值),那么依赖回调做了什么?依赖回调会遍历deps,将每一个包含渲染函数的watcher实例执行update更新操作。
* update更新操作干了什么?update做的事情就是重复一遍watcher(监听者)做的事情。再次执行这个渲染函数,此时触发getter操作。依赖重新收集,渲染出画面,此时数据拿到的是新值。