当前位置: 首页 > Web前端 > JavaScript

Vue2双向数据绑定

时间:2023-03-26 23:53:30 JavaScript

双向数据绑定是vue2的核心技术,比较复杂。下面是实现过程和简单的源码。在创建vue实例时,vue做了三件事:属性监控(Observe)属性代理(Obagent)上班编译(Compile)observe:为vuedate上的属性添加get和set方法(通过递归调用Object.defineProperty)注意:这时候body上的getset方法会在每个vue实例上的属性被访问或者修改的时候被触发。这是Vue的数据劫持Obagent:通过Object.defineProperty监听直接访问vm上设置对象这时候在vm数据上访问或者设置对象注意:Obagent只需要劫持顶层数据上的数据编译模板注意事项:文件碎片是比较有争议的。新版非ie文件片段的表现是没有问题的。考虑到这一点,我建议使用模板字符串拼接的方法。这里,兼容ie获取vue实例的根节点(#app),挂在vue实例上,递归添加根节点上的所有子节点到文档片段(创建一个空的文档片段就是fineenough)并在递归添加文档片段的过程中替换vue数据上的值{{}},以及v-model的值,最后将文档片段添加到根节点。至此,Vue对实例上数据的渲染就完成了。Vue有两个类,分别是集合订阅者(Dep)和发布订阅者(Watcher)Dep:存储所有的订阅者(watcher)一个临时target并添加一个watcher/update方法来调用watcherwatcher:属性有一个vueinstancekey回调函数和一个在模板编译时更新自身以收集所有watchers的方法,在每次响应DOM上的数据和Vue实例数据时都会创建一个watcher。每次创建一个watcher,watcher指向Dep的target,然后通过触发get方法将watcher添加到子集合中(触发get方法vue使用了trick方式,每次创建watcher时,都会携带akey,并使用reducepanacea的方法链式访问这个值触发get方法,在页面数据修改时(设置触发时间)得到想要的结果(清除dep上的target)调用notifydep的区域循环调用watcher上的更新(更新回调将接受一个newValue,通过更新node节点实现双向绑定的效果)