标签:执行 dom操作 log 写法 动态绑定 印象 观察 订阅 api
Vue.js,其简洁的API以及活跃的社区,对于打算从angular转向Vue还是挺友好的,打算最近一段时间去整理下Vue自己的一些思考,加深下对于此的印象。
Vue与Angular同属于MVVM框架,MVVM的本质是通过数据绑定链接View和Model,让数据的变化自动映射为视图的更新。Vue.js在数据绑定的API设计上借鉴了Angular的指令机制:用户可以通过具有特殊前缀的HTML 属性来实现数据绑定,也可以使用常见的花括号模板插值,或是在表单元素上使用双向绑定:
<!-- 指令 --> <span v-text="msg"></span> <!-- 插值 --> <span>{{msg}}</span> <!-- 双向绑定 --> <input v-model="msg">
插值本质上也是指令,只是为了方便模板的书写。在模板的编译过程中,Vue.js会为每一处需要动态更新的DOM节点创建一个指令对象。每当一个指令对象观测的数据变化时,它便会对所绑定的目标节点执行相应的DOM操作。基于指令的数据绑定使得具体的DOM操作都被合理地封装在指令定义中,业务代码只需要涉及模板和对数据状态的操作即可,这使得应用的开发效率和可维护性都大大提升。
与Angular不同的是,Vue.js的API里并没有繁杂的module、controller、scope、factory、service等概念,一切都是以“ViewModel 实例”为基本单位:
<!-- 模板 --> <div id="app"> {{msg}} </div>
// 原生对象即数据 var data = { msg: ‘hello!‘ } // 创建一个 ViewModel 实例 var vm = new Vue({ // 选择目标元素 el: ‘#app‘, // 提供初始数据 data: data })
渲染结果:
<div id="app"> hello! </div>
在渲染的同时,Vue.js也已经完成了数据的动态绑定:此时如果改动data.msg的值,DOM将自动更新。是不是非常简单易懂呢?除此之外,Vue.js对自定义指令、过滤器的API也做了大幅的简化,如果你有Angular的开发经验,上手会非常迅速。
Angular的数据观测采用的“脏值检查机制”,每一个指令都会有一个对应的用来观察到对象的变化,这个应用叫做watcher,一个作用域中可能会有多个watcher,当数据发生变化,页面更新,Angular会遍历当前页面中所有的watcher,对他们一一求值,与之前的值进行对比,如果求值的结果变化了,就会触发对应的更新,这个过程叫做digest cycle。脏值检查的劣势也就有两点:
Vue.js采用的则是基于依赖收集的观测机制。也有一说法,叫做数据劫持,用到了ES5的Object.defineProperty(),所以它只能兼容到IE9之后的环境。它的基本原理是:
标签:执行 dom操作 log 写法 动态绑定 印象 观察 订阅 api
原文地址:http://www.cnblogs.com/fangshidaima/p/6287297.html