前端面试 vue 部分 (2)——Vue是如何实现双向绑定的

数据的双向绑定

当数据发生变化,ViewModel能够监听到数据的这种变化,然后通知到对应的视图做自动更新,而当用户操作视图,ViewModel 也能监听到视图的变化,然后通知数据做改动,这实际上就实现了数据的双向绑定

  1. Vue.js 是采用 Object.defineProperty 的 getter 和 setter ,并结合 观察者模式 来实现数据绑定的。

  2. 当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,并用Object.defineProperty()方法把它们转化为 getter/setter方法。当data中的属性被访问时,则会调用getter方法;当data中的属性被改变时,则会调用setter方法

  3. 名词解释

  • 监听器 Observer :利用 Object.defineProperty() 对属性都加上 setter 和 getter实现数据劫持

  • 解析器 Compile :解析 Vue 模板指令,将模板中的变量都替换成数据,然后初始化渲染页面视图

  • 订阅者 Watcher :Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁 ,主要的任务是订阅 Observer 中的属性值变化的消息,当收到属性值变化的消息时,触发解析器 Compile 中对应的更新函数。

  • 订阅器 Dep :用来收集订阅者 Watcher,对监听器 Observer 和 订阅者 Watcher 进行统一管理。

  1. 详解( 参考链接

    1. 首先我们需要设置一个 监听器Observer , 对数据对象进行遍历,包括子属性对象的属性,利用 Object.defineProperty() **** 对属性都加上 setter 和 getter 。这样的话,给这个对象的某个值赋值,就会触发 setter,那么就能监听到了数据变化 。如果属性发上变化了,就需要告诉订阅者Watcher看是否需要更新。

    2. 因为订阅者是有很多个,所以我们需要有一个 消息订阅器Dep 来专门收集这些订阅者,然后在监听器Observer和订阅者Watcher之间进行统一管理的。

    3. 接着,我们还需要有一个 指令解析器Compile , 解析 Vue 模板指令,将模板中的变量都替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动, 订阅者Watcher 收到通知,调用更新函数进行数据更新

    4. 此时当 订阅者Watcher 接收到相应属性的变化,就会执行对应的更新函数,从而更新视图。
      欢迎留言~~~

(0)

相关推荐

  • 前端面试 vue 部分 (1)——谈谈你对 MVVM 的理解

    [答案] MVVM 由 Model.View.ViewModel 三部分构成 Model 代表数据模型,也可以在 Model 中定义数据修改和业务逻辑: View 代表 UI 组件,它负责将数据模型转 ...

  • 前端面试每日 3+1 —— 第645天

    今天的知识点(2021.01.20)-- 第645天 [html]本地存储和cookie之间的区别是什么? [css]在Less中有哪些不同类型的函数? [js]写一个JS方法,判断元素是否在可视区域 ...

  • 前端面试每日 3+1 —— 第509天

    今天的知识点(2020.09.06)-- 第509天 [html]如何优化大数据列表(10万+)的性能?说说你的方案 [css]flex:1与flex:auto有什么区别? [js]SeaJS和Req ...

  • 前端面试每日 3+1 —— 第481天

    今天的知识点(2020.08.09)-- 第481天 [html]button标签的type默认值是什么呢? [css]position的relative和absolute分别是相对谁进行定位的? [ ...

  • 前端面试每日 3+1 —— 第457天

    今天的知识点(2020.07.16)-- 第457天 [html]写一个鼠标跟随的特效 [css]page-break-before和page-break-after属性有什么应用场景? [js]js ...

  • 前端面试每日 3+1 —— 第454天

    今天的知识点(2020.07.13)-- 第454天 [html]p标签里面嵌套img标签会出现向上高3像素是什么原因?如何处理? [css]请说说css的三大特性是什么? [js]客户端与服务端时间 ...

  • 前端面试每日 3+1 —— 第453天

    今天的知识点(2020.07.12)-- 第453天 [html]表单可以跨域吗? [css]css子元素会继承父元素的font-size吗?请解释下面父子元素各字体的大小[代码] [js]给你一个页 ...

  • 前端面试每日 3+1 —— 第452天

    今天的知识点(2020.07.11)-- 第452天 [html]对于rtl网站的适配有哪些方案? [css]你有用到以pt为单位过吗?pt单位有什么应用场景呢? [js]如何使用js实现撤消和重做并 ...

  • 前端面试每日 3+1 —— 第451天

    今天的知识点(2020.07.10)-- 第451天 [html]404页面有什么作用? [css]如何设置字体的左右间距? [js]你用什么过Navigator.sendBeacon()吗?说说它有 ...