美文网首页
Vue MVVM 原理实现

Vue MVVM 原理实现

作者: _1633_ | 来源:发表于2020-08-09 12:44 被阅读0次

核心原理

MVVM 模型

    MVVM 双向数据绑定, 数据驱动视图

    Vue 实现 MVVM 采用 数据劫持 + 发布订阅模式 :

    当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用Object.defineProperty 把这些 property 全部转为 getter/setter

    Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。

    这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。

    每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。

响应式原理

Object.defineProperty(obj,prop,descriptor)

        obj    要定义属性的对象。

        prop  要定义或修改的属性的名称或 Symbol。

        descriptor  要定义或修改的属性描述符

    descriptor 中一些属性描述符

    对象里目前存在的属性描述符有两种主要形式:数据描述符 和 存取描述符。数据描述符 是一个具有值的属性,该值可以是可写的,也可以是不可写的。存取描述符  是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者

    这两种描述符都是对象。它们共享以下可选键值(默认值是指在使用 Object.defineProperty() 定义属性时的默认值):

        configurable: 是否可以配置(修改)以及是否可以删除, 默认为 false

        enumerable:是否可以遍历,默认为 false

    数据描述符还具有以下可选键值:

        value

        该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined

        writable

        当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变。默认为 false。

    存取描述符还具有以下可选键值:

        get

        属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。默认为 undefined

        set

        属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。默认为 undefined


实现简单的 Vue    

    实现一个简单的 MVVM 大概分为三个步骤:1. 数据劫持,观察数据变化;2. 模板编译;3. Watcher 根据数据变化 通知 watcher ,使相关的组件重新渲染

MVVM

    1 new MVVM

        MVVM 作为连接 Complie 和 Observer 的 桥梁而存在。

myVue.js

    2. 数据劫持

        遍历 data 内的所有数据, 将他们转 为 set 和 get 的形式。 

observer.js

    3. 模板编译

        将模板中的所有含 data 中的数据,形式如 {{ a }}, v- model = 'a ',全部替换成 data 中的 数值,并且在这个阶段给每个data 中的数据添加 watcher,当该值 发生变化的时候,通知 watcher 进行 更新。

compile.js

    4. watcher

        给模板中的所有含 data 中的数据 添加一个 watcher,当这个数据发生变化的时候,触发 watcher,将模板中的 数据进行更新。

watcher.js

    5. 发布订阅

        订阅 模板中同一个 data 所对应的所有 watcher, 当这个数据改变时候,通知这个数据对应的所有 watcher, 进行更新。

dep.js 运用

总结

    Vue MVVM 采用 数据劫持 + 发布订阅的方式

    首先 将 data 中的数据 全部转换 成 set 和 get 的形式; 再编译模板,将模板中的 {{}} , v-XX 中的变量 替换成 data 中的数据;

    在 编译模板的过程中,给 每一个模板中的变量增加一个 watcher,这个 watcher 有 数据变化时所对应的将 模板中的数据 替换为最新的数据的 处理函数,将这个 watcher 添加到 这个变量订阅 的 数组中,一个变量对应一个 wathcer 数组;

    当数据发生变化,触发 set 方法,在 set 中 发布 该数据 对应的 watcher 数组,依次执行 watcher,更新 模板中的数据。

    收获: 理解 发布订阅模式的 实际应用。

相关文章

  • Vue2.0原理与MVVM的实现

    剖析Vue原理&实现双向绑定MVVM vue源码 双向绑定 -- MVVM 目前几种主流的MVC框架都实现了单向数...

  • Vue实现原理

    vue实现原理 1、了解Object的属性defineProperty 2、vue中mvvm的实现: 数据变化更新...

  • vue的mvvm原理解析及手写一个

    # 手写vue的mvvm实现原理 ## 1:mvc和mvvm的区别? MVC:modal-view-control...

  • 2019-10-31

    手写vue的mvvm实现原理 1:mvc和mvvm的区别? MVC:modal-view-controller,比...

  • Vue MVVM 原理实现

    核心原理 MVVM 双向数据绑定, 数据驱动视图 Vue 实现 MVVM 采用 数据劫持 + 发布订阅模式 : ...

  • Vue双向数据绑定原理

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

  • 关于双向绑定的问题

    剖析Vue实现原理 - 如何实现双向绑定mvvm 本文能帮你做什么?1、了解vue的双向数据绑定原理以及核心代码模...

  • Vue的34道题

    1、如何理解MVVM原理? MVVM的实现原理 2、响应式数据的原理是什么? 响应式数据与数据依赖基本原理vue双...

  • vue相关文章保存

    剖析Vue实现原理 - 如何实现双向绑定mvvm Object.defineProperty()MDN介绍 谈谈J...

  • 好程序员web前端培训分享MVVM框架Vue实现原理

    好程序员web前端培训分享MVVM框架Vue实现原理,Vue.js是当下很火的一个JavaScript MVVM库...

网友评论

      本文标题:Vue MVVM 原理实现

      本文链接:https://www.haomeiwen.com/subject/fssifktx.html