审核中~
溜忙之道
首页
溜忙手册
offer之道
项目Git
写文章
登录
·
注册
登录
没有账号,去注册
注册
已有账号,去登录
博客
剖析Vue实现原理 - 如何实现双向绑定mvvm
南易_站长
阅读量:4063
关注
剖析Vue实现原理 - 如何实现双向绑定mvvm
转载 :[https://github.com/DMQ/mvvm/blob/master/readme.md](https://github.com/DMQ/mvvm/blob/master/readme.md) Update: [Vue3.0响应式原理精简代码](https://github.com/DMQ/mvvm/blob/vue3/reactivity/index.html) > 本文能帮你做什么?
> 1、了解vue的双向数据绑定原理以及核心代码模块
> 2、缓解好奇心的同时了解如何实现双向绑定
> 为了便于说明原理与实现,本文相关代码主要摘自[vue源码](https://github.com/vuejs/vue), 并进行了简化改造,相对较简陋,并未考虑到数组的处理、数据的循环依赖等,也难免存在一些问题,欢迎大家指正。不过这些并不会影响大家的阅读和理解,相信看完本文后对大家在阅读vue源码的时候会更有帮助
### 几种实现双向绑定的做法 目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input、textarea等)添加了change(input)事件,来动态修改model和 view,并没有多高深。所以无需太过介怀是实现的单向或双向绑定。 实现数据绑定的做法有大致如下几种: > 发布者-订阅者模式(backbone.js) > 脏值检查(angular.js) > 数据劫持(vue.js) **发布者-订阅者模式:** 一般通过sub, pub的方式实现数据和视图的绑定监听,更新数据方式通常做法是 `vm.set('property', value)` **脏值检查:** angular.js 是通过脏值检测的方式比对数据是否有变更,来决定是否更新视图,最简单的方式就是通过 `setInterval()` 定时轮询检测数据变动,当然Google不会这么low,angular只有在指定的事件触发时进入脏值检测,大致如下: - DOM事件,譬如用户输入文本,点击按钮等。( ng-click ) - XHR响应事件 ( $http ) - 浏览器Location变更事件 ( $location ) - Timer事件( $timeout , $interval ) - 执行 $digest() 或 $apply() **数据劫持:** vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过`Object.defineProperty()`来劫持各个属性的`setter`,`getter`,在数据变动时发布消息给订阅者,触发相应的监听回调。
评论
表情
发送
0
评论