Vuex 是什么?

Vuex 是 状态管理的编程模式 + 工具库,适用于 Vue.js 编写的应用。它作为一个集中化的 store (状态存储),服务于应用中的所有组件,其中的规则保证了状态只会在可预测的方式下修改。另外,它能与 Vue 官方提供的 devtools 扩展 集成,提供高级功能,如,无需配置就可以基于时间轴调试,以及状态快照的 导入 / 导出。

"状态管理模式" 是什么?

我们先从一个简单的 Vue 计数器 应用开始:

new Vue({
  // state 状态
  data () {
    return {
      count: 0
    }
  },
  // view 视图
  template: `
    <div>{{ count }}</div>
  `,
  // actions (动作)
  methods: {
    increment () {
      this.count++
    }
  }
})

It is a self-contained app with the following parts:

  • state(状态),单一的数据源,驱动我们的应用。
  • view(视图),也就是声明定义如何从 state 映射到界面。
  • actions(动作),在响应 视图 的用户输入时,所有可能修改状态的方式。

这是一个非常简单的例子,体现了『单向数据流』的核心:

当我们有 多个组件使用公共状态 时,最简单快速的方式就是:

  • 多个视图依赖同一份状态。
  • 不同视图的动作需要修改同一份状态。

那么第一个问题来了,在深层嵌套的组件间传递属性是很繁琐的,并且不能简单地在同级组件之间传递。接着第二个问题是,我们常常诉诸于这样的解决方案:直接引用 父/子 实例,又或是通过事件来修改和同步多分状态副本,用这样的方式编写的程序是很脆弱的,并且很快导致不可维护。

所以,为什么不把共享的状态从组件分离出来,然后在一个全局单例中管理呢?这样,我们的组件树就变成一个大 "视图",无论树中的组件处在哪个位置,它都能访问状态或者触发动作。

另外,通过定义和分离状态管理中的概念、强制使用某些规则,同时也让我们的代码结构清晰,并且容易维护。

这是 Vuex 背后的基本思想,受到 FluxReduxThe Elm Architecture 所启发。 不像其他模式, Vuex 也是一个库,专门为 Vue.js 定制,充分利用了它微妙地响应式机制,从而实现高效更新。

vuex

什么时候该使用?

虽然 Vuex 帮助处理了共享状态管理,但是它也额外地带来了一些概念和代码,这需要你在短期和长期的效益之间作取舍。

如果你没有开发过大型的单页应用就立刻上 Vuex,可能会觉得繁琐然后排斥,这是很正常的 —— 如果是个简单的应用,大多数情况下,不用 Vuex 还好,你要的可能就是个简单的 全局事件总线。不过,如果你构建的是一个 中大型 单页应用,当你在考虑如何更好的在 Vue 组件外处理状态时,Vuex 自然就是你的下一步选择。Redux 的作者有一句话说的不错:

Flux libraries are like glasses: you’ll know when you need them.(Flux 库正如眼镜:当你需要它们的时候,你就懂了。)