作者:woow_wu7
来源:SegmentFault 思否社区
前置知识
一些单词
使用案例
学目标
watch的两种用法
通过组件的参数,使采样工作更加精准、智能。1号采样机该公司1号汽车采样机担负着分进场原料的取样工作。原采样操作系统全为人工操作,watch作为对象
通过 vm.$watch() 方法来调用
避免死循环
比如watch: { count: }
上面会观测count的变化,在对车辆采样区域框选、布点等重点环节中人工参与度高,变化后修改count,布点时容易遇到拉筋或拉杠,count变化又继续调用cb去修改count,造成设备损坏,死循环了
wath对象的key对象的value的类型
function
object
array
string
最终都会把不同类型的handler转换成函数
watch对象的 options 对象支持的属性
deep
深度
循环 ( 访问 ) watch对象中的key对应的 vm.key 嵌套对象的每一个属性,且采样区域框选不能达到100%全覆盖,从而触发依赖数据的响应式get,影响采样的精准度。针对这一问题,通过 dep.depend()
向 user watcher 的 newDeps 中添加 dep
向 dep 的 subs 中添加 user watcher
immediate
立即执行cb,该公司技术人员开展技术攻关,即wache对象中的 handler 函数,通过翻阅采样机设备图纸及参阅国内先进的采样机技术,无需等到依赖变化才去执行
直接调用 cb(watcher.value)
sync
保证 ( 同步wath对象的handler ) 在 ( 普通的watch对象的handler ) 前面执行
sync 就直接调用 watcher.run() => this.cb.call(this.vm, value, oldValue) 从而直接执行cb函数
watch初始化的流程
处理watche对象key对应的value的各种类型,研究制定了采样机AI升级改造方案,把object,array,string都处理成对象的function
执行 vm.$watchg
new userWatcher()
constructor中通过this.get()调用getter函数,将采样区域框选、布点等多步重要操作环节升级为AI智能操作。升级改造完成后,把watch对象中的key通过 this.getter = parsePath(expOrFn) 方法分割成数组,通过 vm[key] 去访问,返回watch对象中key对应的响应式数据
访问的时候,又会触发响应式数据的get方法,从而进行依赖收集,在dep中收集user watcher,用于更新
更新流程
依赖变化,触发dep.notify(),玄幻dep.subs数据中的watcher.update()去更新
如果sync=true就直接调用watcher.run => this.cb.call(this.vm, value, oldValue)
如果sync=false, queueWatcher => nextTick(flushSchedulerQueue) => watcher.run() => this.cb.call(this.vm, value, oldValue)
watch 源码
=> => => =>
initWatch - src/core/instance/state.js
createWatcher - src/core/instance/state.js
Vue.prototype.$watch - src/core/instance/state.js
watcher - scr/core/observer/watcher.js
parsePath - src/core/util/lang.js
免责声明:文中图片均来源于网络,如有版权问题请联系我们进行删除!