本文总结自: 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双向绑定补充说明方法的更多相关文章

  1. Vue双向绑定的实现原理系列(四):补充指令解析器compile

    补充指令解析器compile github源码 补充下HTML节点类型的知识: 元素节点 Node.ELEMENT_NODE(1) 属性节点 Node.ATTRIBUTE_NODE(2) 文本节点 N ...

  2. Vue双向绑定的实现原理系列(一):Object.defineproperty

    了解Object.defineProperty() github源码 Object.defineProperty()方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. ...

  3. vue双向绑定的原理及实现双向绑定MVVM源码分析

    vue双向绑定的原理及实现双向绑定MVVM源码分析 双向数据绑定的原理是:可以将对象的属性绑定到UI,具体的说,我们有一个对象,该对象有一个name属性,当我们给这个对象name属性赋新值的时候,新值 ...

  4. IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题

    先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...

  5. Vue双向绑定原理,教你一步一步实现双向绑定

    当今前端天下以 Angular.React.vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋. 所以我们要时刻保持好奇心,拥抱变化,只有在不断的变 ...

  6. 梳理vue双向绑定的实现原理

    Vue 采用数据劫持结合发布者-订阅者模式的方式来实现数据的响应式,通过Object.defineProperty来劫持数据的setter,getter,在数据变动时发布消息给订阅者,订阅者收到消息后 ...

  7. vue双向绑定原理分析

    当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/jiangzhenf ...

  8. vue双向绑定原理及实现

    vue双向绑定原理及实现 一.总结 一句话总结:vue中的双向绑定主要是通过发布者-订阅者模式来实现的 发布 订阅 1.单向绑定和双向绑定的区别是什么? model view 更新 单向绑定:mode ...

  9. vue双向绑定原理源码解析

    当我们学习angular或者vue的时候,其双向绑定为我们开发带来了诸多便捷,今天我们就来分析一下vue双向绑定的原理. 简易vue源码地址:https://github.com/maxlove123 ...

随机推荐

  1. 腾讯云DevOps 解决方案

    地址:https://www.qcloud.com/solution/devops 主要经历的几个阶段: 代码托管 持续集成与交互 测试管理 运维监控 项目管理 在上面图中都有,可以回过去查看.

  2. angular中通过CSS使下拉列表默认值变灰

    angular版本:angular5 先看效果图: drop down的样式是我用CSS样式控制的,没有用插件.想要改变Drop Down List里的默认值的颜色,我的思路是这样的. 在<se ...

  3. Mongodb基本操作入门,增删改查和索引

    主要进程 mongod.exe为启动数据库实例的进程. mongo是一个与mongod进程进行交互的JavaScript shell进程,它提供了一些交互的接口函数用户对数据库的管理. 基本命令 sh ...

  4. WPF的TextBox抛出InvalidOperationException异常:Cannot close undo unit because no opened unit exists.

    近期遇到一个问题.应用使用过程中突然崩溃,查看dump发现异常信息例如以下: UI dispatcher has encountered a problem: 无法关闭撤消单元.由于不存在已打开的单元 ...

  5. spring+springMVC+hibernate整合

    首先我们要知道hibernate五大对象:,本实例通过深入的使用这五大对象和spring+springMVC相互结合,体会到框架的好处,提高我们的开发效率 Hibernate有五大核心接口,分别是:S ...

  6. ORACLE 表空间使用率查询

    SELECT A.TABLESPACE_NAME, A.BYTES / (1024 * 1024 * 1024 ) TOTAL, B.BYTES / (1024 * 1024 * 1024 ) USE ...

  7. Jlink升级_官网

    Jlink官网:https://www.segger.com/ 关于JLINK固件丢失或升级固件后提示Clone的解决办法 本人用的JLINK仿真器(某宝上买的),在使用新版KEIL时,提示要升级固件 ...

  8. Maven学习----dependencies与dependencyManagement的区别(转)

    转自:http://blog.csdn.net/liutengteng130/article/details/46991829 1.DepencyManagement应用场景 当我们的项目模块很多的时 ...

  9. JSP 表单处理向服务器提交信息

    JSP 表单处理 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理.浏览器中使用 GET 和 POST 方法向服务器提交数据. GET 方法 GET方法将请求的编码信息添加在网址后面, ...

  10. js 抢月饼

    面源码: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" co ...