状态管理
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
- 小型项目
- 中小型项目(store模式)
- 中大型项目
什么是“状态管理模式”
状态自管理应用包含以下几个部分:
● state,驱动应用的数据源;
● view,以声明方式将 state 映射到视图;
● actions,响应在 view 上的用户输入导致的状态变化。
在传统开发模式中,我们是以单向数据流的方式进行数据传递的;但是实际开发过程中,如果模块较多的情况下,可能会出现以下情况:
● 多个视图依赖于同一状态。
● 来自不同视图的行为需要变更同一状态。
对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。
对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。
因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢?在这种模式下,我们的组件树构成了一个巨大的“视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!
什么情况下我应该使用 Vuex
Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行权衡。
如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
简单的 store 模式
//store.js
var store = {
debug: true,
state: {
msg: 'Hello!'
}
}
export default store
//A.vue B.vue
import store from '../utils/store'
export default {
data:function(){
return {
store:store.state
}
}
}
单一状态树
Vuex 使用单一状态树——是的,用一个对象就包含了全部的应用层级状态。至此它便作为一个“唯一数据源 (SSOT)”而存在。这也意味着,每个应用将仅仅包含一个 store 实例。单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态的快照。
单状态树和模块化并不冲突——在后面的章节里我们会讨论如何将状态和状态变更事件分布到各个子模块中。
State
存放数据:
state: {
name:'zhangsan'
//....
},
如何使用:
//方式一(不推荐)
<template>
{
{
$store.state.name}}
</template>
//方式二(计算属性)
<template>
{
{
name}}
</template>
computed:{
name(){
return this.$store.state.name
}
}
//方式三(辅助函数)
//项目中常用的方式
<template>
{
{
name}}
</t