vue双向绑定补充说明方法
本文总结自: https://segmentfault.com/a/1190000006599500,将每一个流程提炼出来做一个简单的说明,以免自己被繁杂的逻辑弄昏头脑~
observer: 遍历数据并挟持所有属性,为每一个属性创建dep对象(订阅器, 内含数组sub装载订阅者watcher),当属性发生改变的时候通知此dep,并由他告知所有订阅者(即在set方法中调用dep的notify)
备注: 由于dep创建于函数内部,外部无法访问,因此为其添加watcher变得很尴尬,因此先将watcher赋值给全局变量Dep.target,再添加到sub
dep(订阅器): 可添加sub、轮流调用watcher的update方法
compile: 解析所有指令,遍历所有节点和文本,
对于节点,先转为fragment(操作fragment速度比直接操作dom快),再遍历其所有vue属性,例如v-mode,v-on:click。。。
由专门的解析工具compileUtil处理, 对于事件属性(v-on:xxx),创建此节点对应事件的监听函数并创建watcher对象,以回调函数作为其参数,而此回调函数内调用updater的方法进行视图更新。
对于v-model,先赋值在创建监听函数
。。
其他v-class、v-text均有相应处理方式
compileUtil: 一个工具对象,提供不同属性的处理方式
watcher: 是连接observer与compile的桥梁
1.被创建时便调用对应属性的get方法以将自己添加到dep中
2.包含update方法,能调用它的回调函数
3.当dep的notify调用时自己的update方法被调用
updater对象: 更新视图,当watcher的update方法被触发时提供对应的方法更新视图,更改数据。
初始化时:
1.observer挟持所有属性,创建对应dep
2.解析所有指令(遍历节点,遍历属性),节点转fragment对象,创建监听函数,创建watcher对象并添加到dep中,watcher回调函数控制视图更新,数据变化
3.fragment处理完毕后初始化视图
当我们触发被监测的事件(例如click),将: 触发监听函数-->updater更新视图,更改数据-->因为数据被挟持,触发set方法-->通知对应dep-->dep通知所有的watcher更新-->所有回调函数执行-->视图更新
当改变data,将: 因为数据被挟持,触发set方法-->通知对应dep-->dep通知所有watcher更新-->所有回调函数执行-->视图更新
vue双向绑定补充说明方法的更多相关文章
- Vue双向绑定的实现原理系列(四):补充指令解析器compile
补充指令解析器compile github源码 补充下HTML节点类型的知识: 元素节点 Node.ELEMENT_NODE(1) 属性节点 Node.ATTRIBUTE_NODE(2) 文本节点 N ...
- Vue双向绑定的实现原理系列(一):Object.defineproperty
了解Object.defineProperty() github源码 Object.defineProperty()方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. ...
- vue双向绑定的原理及实现双向绑定MVVM源码分析
vue双向绑定的原理及实现双向绑定MVVM源码分析 双向数据绑定的原理是:可以将对象的属性绑定到UI,具体的说,我们有一个对象,该对象有一个name属性,当我们给这个对象name属性赋新值的时候,新值 ...
- IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题
先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...
- Vue双向绑定原理,教你一步一步实现双向绑定
当今前端天下以 Angular.React.vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋. 所以我们要时刻保持好奇心,拥抱变化,只有在不断的变 ...
- 梳理vue双向绑定的实现原理
Vue 采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后 ...
- vue双向绑定原理分析
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/jiangzhenf ...
- vue双向绑定原理及实现
vue双向绑定原理及实现 一.总结 一句话总结:vue中的双向绑定主要是通过发布者-订阅者模式来实现的 发布 订阅 1.单向绑定和双向绑定的区别是什么? model view 更新 单向绑定:mode ...
- vue双向绑定原理源码解析
当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/maxlove123 ...
随机推荐
- Maven环境下搭建SSH框架之Spring整合Struts2
© 版权声明:本文为博主原创文章,转载请注明出处 1.搭建环境 Struts2:2.5.10 Spring:4.3.8.RELEASE 注意:其他版本在某些特性的使用上可能稍微存在差别 2.准备工作 ...
- CSRF介绍与应对以及Java代码示例
详细信息看这里:https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 简介 CSRF(Cross Site Request Forg ...
- JavaScript 中的命名空间
全局变量应该由有系统范围相关性的对象们保留,并且它们的命名应该避免含糊并尽量减少命名冲突的风险.在实践中,这意味着你应该避免创建全局对象,除非它们是绝对必须的. 所以你对此是怎么做的?传统方法告诉我们 ...
- SPI协议介绍
一.概述 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制 ...
- [译]GLUT教程 - 鼠标
Lighthouse3d.com >> GLUT Tutorial >> Input >> The Mouse 上一节我们讨论了怎么用GLUT的键盘函数跟OpenG ...
- 你不知道的Google Search
0.导读 这篇文章讲了这三个事儿: 如何訪问Google?----------什么?不是直接输入地址么? Google的地址是什么? ------ 你在逗我?难道不是www.google.com? G ...
- UIWebView的全屏截图
项目开发中,我们可能会遇到如下的应用场景:将一篇文章,进行截屏(需要全屏截取,包括滚动部分)后,分享到新浪微博.邮箱等等.前段时间,我在应用开发中实现了该功能,代码也是从网上找到的,自己整理了一下.主 ...
- Android Studio gradle 文件中 ${supportLibVersion} 用法
一般我们在项目中的gradle会添加如下库文件 dependencies { compile 'com.android.support:appcompat-v7:23.1.0' compile 'co ...
- 使用badboy录制脚本 结合Jmeter一起测试。
1.badboy介绍 Badboy是一款不错的Web自动化测试工具,如果你将它用于非商业用途,或者用于商业用途安装Badboy 的机器数量不超过5台,你是不需要为它支付任何费用的.Badboy提供了将 ...
- Android SQLite基本用法
SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLit ...