@@ -6,8 +6,9 @@ Vuex 并不限制你的代码结构,但是制定了一套需要遵守的规则
662 . 只有 mutation handlers 可以改变 state;
773 . Mutations 必须是同步的,它们做的应该仅仅是改变 state;
884 . 所有类似数据获取的异步操作细节都应封装在 actions 里面。
9+ 5 . 组件通过 getters 从 store 中获取 state,并通过调用 actions 来改变 state。
910
10- Vuex actions 和 mutations 优雅的地方在于 ** 它们都只是一些函数** 。只需要遵循以上的准则,怎么组织代码就取决于你自己了。最简单的 Vuex store 实例甚至可以在 [ 单个文件 ] ( https://github.com/vuejs/ vuex/blob/master/examples/counter/vuex.js ) 中声明!然而这在真正的项目里显然是行不通的,所以这里有些根据不同应用规模推荐的不同结构 。
11+ Vuex actions 和 mutations 优雅的地方在于 ** 它们都只是一些函数** 。只需要遵循以上的准则,怎么组织代码就取决于你自己了。不过,遵循一些规则能够让你更快地熟悉其他使用 vuex 的项目。这里介绍了一些适应不同项目规模的应用结构 。
1112
1213### 简单的项目
1314
@@ -26,7 +27,9 @@ Vuex actions 和 mutations 优雅的地方在于 **它们都只是一些函数**
2627 └── mutations.js # exports all mutations
2728```
2829
29- 参见 [ TodoMVC 示例] ( https://github.com/vuejs/vuex/tree/master/examples/todomvc ) .
30+ 参见[ 计数器 示例] ( https://github.com/vuejs/vuex/tree/master/examples/todomvc ) 或 [ TodoMVC 示例] ( https://github.com/vuejs/vuex/tree/master/examples/todomvc ) .
31+
32+ 另外,你也可以将 mutations 拆分到不同的文件中去。
3033
3134### 中型到大型项目
3235
@@ -42,13 +45,13 @@ Vuex actions 和 mutations 优雅的地方在于 **它们都只是一些函数**
4245├── components
4346│ ├── App.vue
4447│ └── ...
45- └── store
46- ├── actions.js # exports all actions
47- ├── index .js
48- ├── modules
49- │ ├ ── cart.js # state and mutations for cart
50- │ └ ── products .js # state and mutations for products
51- └── mutation-types .js # constants
48+ └── vuex
49+ ├── actions.js # exports all actions
50+ ├── store .js # where we assemble modules and export the store
51+ ├── mutation-types.js # constants
52+ └ ── modules
53+ ├ ── cart .js # state and mutations for cart
54+ └── products .js # state and mutations for products
5255```
5356
5457一个典型的模块:
@@ -58,46 +61,68 @@ Vuex actions 和 mutations 优雅的地方在于 **它们都只是一些函数**
5861import { RECEIVE_PRODUCTS , ADD_TO_CART } from ' ../mutation-types'
5962
6063// 该模块的初始状态
61- export const productsInitialState = []
64+ const state = {
65+ all: []
66+ }
6267
6368// 相关的 mutations
64- export const productsMutations = {
69+ const mutations = {
6570 [RECEIVE_PRODUCTS ] (state , products ) {
66- state .products = products
71+ state .all = products
6772 },
6873
69- [ADD_TO_CART ] ({ products }, productId ) {
70- const product = products .find (p => p .id === productId)
71- if (product .inventory > 0 ) {
72- product .inventory --
73- }
74+ [ADD_TO_CART ] (state , productId ) {
75+ state .all .find (p => p .id === productId).inventory --
7476 }
7577}
78+
79+ export default {
80+ state,
81+ mutations
82+ }
7683```
7784
78- 在 ` store/index .js` 里我们把多个模块集合在一起来创建 Vuex 实例:
85+ 在 ` vuex/store .js` 里我们把多个模块集合在一起来创建 Vuex 实例:
7986
8087``` js
8188import Vue from ' vue'
8289import Vuex from ' ../../../src'
8390import * as actions from ' ./actions'
8491// 导入各个模块的初始状态和 mutations
85- import { cartInitialState , cartMutations } from ' ./modules/cart'
86- import { productsInitialState , productsMutations } from ' ./modules/products'
92+ import cart from ' ./modules/cart'
93+ import products from ' ./modules/products'
8794
8895Vue .use (Vuex)
8996
9097export default new Vuex .Store ({
91- // ...
92- // 将各个模块的状态组合成最终的根状态 (root state)
93- state: {
94- cart: cartInitialState,
95- products: productsInitialState
96- },
97- // mutations 选项可以是一个包含多个对象的数组
98- mutations: [cartMutations, productsMutations]
98+ // 组合各个模块
99+ modules: {
100+ cart,
101+ products
102+ }
99103})
100104```
105+ 在这里,` cart ` 模块的初始状态会作为 ` store.state.cart ` 被设置到底层 state 树上。另外,** 所有在子模块上定义的 mutations 都只能改变当前相关联子模块上的 state 子树** 。所以在 ` cart ` 模块上定义的 mutations 接收到的第一个参数将会是 ` store.state.cart ` 。
106+
107+ state 子树的根节点不能在模块内部改写。比如这样的写法是无效的:
108+
109+ ``` js
110+ const mutations = {
111+ SOME_MUTATION (state ) {
112+ state = { ... }
113+ }
114+ }
115+ ```
116+
117+ 可替代的写法是将真实的 state 作为子树本身的属性在存储:
118+
119+ ``` js
120+ const mutations = {
121+ SOME_MUTATION (state ) {
122+ state .value = { ... }
123+ }
124+ }
125+ ```
101126
102127由于一个模块导出的仅仅是对象和函数,它们也是非常易于测试和维护的。当然,你也可以按你的喜好和需求对这样的组织方式进行修改。
103128
0 commit comments