单一状态树
Vuex使用单一状态树,用一个对象包含了全部的应用级状态。
作为一个唯一数据源SSOT而存在。这也意味着,每个应用将
仅仅包含一个store实例。
单一状态树让我们能够直接的定位任一特定的状态片段,在调试的
过程中也能轻易的取得整个当前应用状态的快照。
new Vuex.store({
state:{
}
})
单一状态树和模块化并不冲突
获得Vuex状态State
由于Vuex的状态存储是响应式的,从store实例中读取状态最简单
的方法就是在计算属性中返回某个状态。
然而这种模式导致逐渐依赖全局状态单例,在每个需要使用state的组件
中需要频繁的导入,并且在测试逐渐时需要模拟状态。
Vuex通过store选项,提供了一种机制将state从根组件注入到每一个
子组件中。
通过在根实例中注册store选项,该store实例会注入到根组件下的所有
之组件中,且子组件能通过this.$store实例访问到。
mapState函数
当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些
重复和冗余,我们可以使用mapState辅助函数帮助我们生成计算属性。
Getter
有时候我们需要从store中的state中派生出一些状态,Vuex允许我们在store
中定义getter,就像计算属性一样,getter的返回值会根据他的依赖被缓存起来,
且只有但他的依赖值发生了改变才会被重新计算。
Getter接受state作为第一个参数。
Getter会暴露为store.getter对象
Getter也可以接受其他getter作为第二个参数
Mutation
更改Vuex的store中的状态的唯一方法是提交mutation.Vuex中的mutation非常类似于
事件:每个mutation都有一个字符串的时间类型type和一个回调函数handler.这个回调函数
就是我们实际机型状态更改的地方,并且他会接受state作为第一个参数。
你不能直接调用一个mutation handler.这个选项更像是事件注册:当出发一个类型的mutation
时,调用此函数。要唤醒一个mutation handler,你需要以相应type调用store.commit方法。
提交载荷payload
你可以向store.commit传入额外的参数,即mutation的载荷payload
在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并且记录的mutation会更易读。
使用常量替代mutation事件类型
使用常量替代mutation事件类型在各种flux种是很常见的模式,这样可以使用liner之类的工具发挥作用,同时
把常量放在单独的文件中可以让你的代码一目了然。
Mutation必须是同步函数
Action
Action类似于mutation,不同在于:
Action提交的是mutation,而不是直接变更状态state
Action可以包含任意异步操作
Action函数接受一个与store实例具有相同方法和属性的context对象,因此你可以调用
context.commit()提交一个mutation,或者通过context.state和context.getters来
获取state和getters,当我们在之后介绍到modules时
分发action
Action通过store.dispatch()方法触发。
Modules
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象,
但应用变得复杂时,store对象就会变得相当臃肿。
Vuex允许我们将store分割成模块modules,每个模块拥有自己的state,mutation,action,getter
甚至是子模块modules,