资讯专栏INFORMATION COLUMN

vuejs 综合介绍 - 译自Vuejs作者博客

Snailclimb / 1029人阅读

摘要:对于一个每秒帧的状态改变,清楚的知道那些节点被影响,更新它们,而避免那些不受影响节点的更新。而脏检查或差分,往往会触发整个子树的重新渲染。截至目前还未发现开放和可复现的。

原文地址:http://blog.evanyou.me/2015/1...

vuejs是一个建造web界面的库。配合其他工具,你也可以称它为“框架”(尽管它更多的看起来像是一堆配合很好的工具集)。如果你从未听说过vue,你可能会想,好吧,我懂了,又一个js框架。事实上Vue并不新,因为我两年以前就开始了它的原型开发,第一个正式版发布于2014年2月,随后不断更新进步,至今已经有很多产品在使用Vue。

那么,Vue到底是干嘛的呢?究竟什么造就了它的与众不同?当这个地球上已经有了angular,ember和react,我为什么还要学习vue?通过带你深入vuejs的设计概念,本篇文章希望能给你一些灵感, 我相信读后你自会有自己的答案。

响应式

保证数据和展现的一致很难,是吗?

我们先从最基本的任务开始,展示数据,假设我们有如下一个简单的对象

var object = {
  message: "Hello world!"
}

模板:

{{ message }}

在Vue里面我们这样将它们结合:

new Vue({
  el: "#example",
  data: object
})

看起来我们仅仅渲染了模板,当我们更新了数据,我们要如何去更新界面呢?什么都不用做,因为Vue已经把这个对象变成了响应式的,当你更改了object.message, html会自动更新。更重要的是,你无须担心如果超时去调用$apply,或者setState(),监听Store的事件,或者创建框架监听属性,比如ko.observable()Ember.Object.create(),vue就这样简单的运作。

Vue同时提供了一个完美的计算属性(computed properties):

var example = new Vue({
  data: {
    a: 1
  },
  computed: {
    b: function () {
      return this.a + 1
    }
  }
})

// both a & b are proxied on the created instance.
example.a // -> 1
example.b // -> 2
example.a++
example.b // -> 3

计算属性b追踪a,自动同步,不需要声明a为b的依赖。
另外,简单类模式(POJO-based)允许很简单的整合任意类型的数据资源或状态管理方案,比如,这里有一个整合了vuejs组件和Rxjs的观察模块,仅仅用了30行代码。

组件

数据绑定对小型demo来说还不错,那么大型应用呢?

对于结构复杂的界面,vue采用了与react十分类似的方案:从上至下的组件化。我们先来看一个可复用组件的例子:

var Example = Vue.extend({
  template: "
{{ message }}
", data: function () { return { message: "Hello Vue.js!" } } }) // register it with the tag Vue.component("example", Example)

现在我们就可以用这个组件在其他模版里,就如同一个自定义页面元素:

一个组件包含另外一些组件,它们形成一个UI树。为了保证它们之间的组合性,Vue组件同时包含如下内容:

定义如何从父级获取数据,使用 props

发布自定义事件,以便在父级作用域中触发它

组合父级引入内容,使用

这里不过多探讨细节,感兴趣请查看官网。

模块化

21世纪了,我们不应该把所有东西都放在全局作用域里

我们使用打包工具(Webpack, Browerify)以及 ES2015.每个组件都是一个模块,Vue会自动把配置对象转换到组件结构里,所以我们只需要在模块里简单的输出如下内容:

// ComponentA.js
export default {
  template: "
{{ message }}
", data () { return { message: "Hello Vue.js!" } } }
// App.js
import ComponentA from "./ComponentA"

export default {
  // use another component, in this scope only.
  // ComponentA maps to the tag 
  components: { ComponentA },
  template: `
    

Now I"m using another component.

` }

看起来不错是吗?如果我们能讲页面的模版,样式和js逻辑封装到一个文件里会更好!尤其是他们本身还有各自的语法高亮。实用工具诸如 Webpack + vue-loader 或者 Browerify + vueify,我们可以这么做:










什么?我们是不是重新定义了web组件?但是css依旧是全局的。

是的,一定程度上我们重新定义了web组件,除了:

我们也可以进行css封装,只需添加scoped属性到