Mambat
@LittleBell_Wang
Reactive Components for Modern Web Interfaces
数据驱动的组件,为现代化的 Web 界面而生
最新版本v2.0.0-beta.7
尤小右 Evan You
@youyuxi
多说 / Google / Meteor
发布于 2014 年 2 月
专注于 View 层的 MVVM 前端库,搭配周边工具,也可被视为一个『前端框架』
Model / View / ViewModel
UI = VM(State)
响应的数据绑定系统 是 Vue.js 的核心,它让数据与 DOM 保持同步非常简单。
数据驱动的视图 ,在普通 HTML 模板中使用特殊的语法将 DOM(文本、结构)绑定到底层数据,每当修改了数据,DOM 便相应的更新。
使用 JQuery 手工操作 DOM 时,我们的代码常常是命令式的、重复和易错的。
应用中的逻辑就几乎都是直接修改数据,不必与 DOM 更新搅在一起。这让我们的代码更容易撰写、理解与维护。
组件系统 是 Vue.js 另一个重要概念,它提供了一种抽象,让我们可以用独立可复用的小组件来构建大型应用。
Vue.js 的组件语法 参考了 Web 组件规范(自定义元素),但其提供了额外的重要功能,比如组件间的数据流,自定义事件系统,以及动态的、带特效的组件替换。
如何组织简单/复杂的 Web 界面:一切都是组件。
<div id="example">
<my-component></my-component>
</div>
// define
var MyComponent = Vue.extend({
template: '<div>A custom component!</div>'
})
// register
Vue.component('my-component', MyComponent)
// create a root instance
new Vue({
el: '#example'
})
<div id="example">
<div>A custom component!</div>
</div>
组件可嵌套,最终组成一个树状结构。为了让组件之间能够有效的进行动态组构,Vue 组件可以:
用 props 来定义如何接收外部数据
用自定义事件来向外传递消息
用 <slot> API 来将外部动态传入的内容(其他组件或是 HTML)和自身模板进行组合
Vue 文件支持局部 CSS,只需在 <style> 标签上加上 scoped 属性即可。
每一个 Vue 组件最终都被编译为纯粹的 JavaScript 模块,最低支持到 IE9。
可以在每一个语言块中使用任何你想用的预处理器。
借助 Webpack 可以将静态资源作为模块依赖来处理。
<div id="app">
<app-nav></app-nav>
<app-view>
<app-sidebar></app-sidebar>
<app-content></app-content>
</app-view>
</div>
利用 过渡系统,可以在元素从 DOM 中插入或移除时自动应用过渡效。
transition 特性可以与下面资源一起用:
v-if
v-show
用v-for (只在插入和删除时触发,使用 vue-animated-list 插件)
<template>
<div>
<router-view transition="ccs-fade"
transition-mode="out-in">
</router-view>
</div>
</template>
.ccs-fade-transition {
-webkit-transition: opacity .3s ease;
transition: opacity .3s ease;
}
.ccs-fade-enter, .ccs-fade-leave {
opacity: 0;
}
把一个普通对象传给 Vue 实例作为它的 data 选项,Vue.js 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。这是 ES5 特性,不能打补丁实现,这便是为什么 Vue.js 不支持 IE8 及更低版本。
模板中每个指令/数据绑定都有一个对应的 watcher 对象,在计算过程中它把属性记录为依赖。之后当依赖的 setter 被调用时,会触发 watcher 重新计算 ,也就会导致它的关联指令更新 DOM。
var data = { a: 1 };
var vm = new Vue({
data: data
}); // `vm.a` 和 `data.a` 现在是响应的
vm.b = 2; // `vm.b` 不是响应的
data.b = 2; // `data.b` 不是响应的
vm.$set('b', 2); // `vm.b` 和 `data.b` 现在是响应的
Vue.set(data, 'c', 3); // `vm.c` 和 `data.c` 现在是响应的
// 不使用 `Object.assign(this.someObject, { a: 1, b: 2 })`
this.someObject = Object.assign({},
this.someObject, { a: 1, b: 2 });
Google、Facebook、Airbnb、
稀土掘金、阿里巴巴、饿了么、苏宁易购、
国美、58、
GitLab、Laravel
更轻、更快
不是普通的 Virtual-DOM
服务端渲染
Native (Weex)
API 大部分兼容 1.0
更轻量、API 更友好、易上手。
更加灵活,而不是任何都要时候遵循 Angular 制定的规范。
Vue.js 的指令和组件分得更清晰,指令只负责 DOM 操作。
Vue.js 有更好的性能,因为其不使用 Dirty Checking。
都处于 Beta 阶段,没有 Release。
Vue2兼容大部分 Vue1的 API,而 Angular2则是推倒重来。
都支持 SSR (Sever-side Rendering),因为都支持 V-DOM。
Vue2 API 兼容 Weex,而 Angular2 则有 NativeScript。
据称:Angular2 的首屏渲染更快,而 Vue2 的 SSR 更高效。
除非要做跨平台 App,否则你不会喜欢 React。
在一个业务界面中,我们通常会根据某些数据去生成一块界面,然后通过界面上的某些操作,改变一些数据,从而影响界面的另外一些部分。
能够描述界面当前状况的数据,就可以被称为状态。
NG 和 Vue 都属于 MVVM 流,通过类似模板的语法,描述界面状态与数据的绑定关系,然后通过内部转换,把这个结构建立起来。当界面发生变化时,按照配置规则去更新相应的数据,然后,再根据配置好的规则去,从数据更新界面。
模块化
组件化
业务模型(业务数据、规则、流程的集合)
开发效率
运行效率
组件化,分治和复用
MVVM,代码量会少一些
配套的 DevTools
Angular1,Dirty Checking
Vue,精确有效的批量异步 DOM 更新
React,Virtual-Dom
复用的工程成本很高,在使用的时候需要权衡,除了最常用了基础控件,其他的不要刻意追求。