Skip to content

Commit 4b8ed22

Browse files
classicemiyyx990803
authored andcommitted
Update structure.md (#206)
Fix some outdated content and examples.
1 parent 5b48d25 commit 4b8ed22

File tree

1 file changed

+53
-28
lines changed

1 file changed

+53
-28
lines changed

docs/zh-cn/structure.md

Lines changed: 53 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ Vuex 并不限制你的代码结构,但是制定了一套需要遵守的规则
66
2. 只有 mutation handlers 可以改变 state;
77
3. Mutations 必须是同步的,它们做的应该仅仅是改变 state;
88
4. 所有类似数据获取的异步操作细节都应封装在 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 优雅的地方在于 **它们都只是一些函数**
5861
import { 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
8188
import Vue from 'vue'
8289
import Vuex from '../../../src'
8390
import * 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

8895
Vue.use(Vuex)
8996

9097
export 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

Comments
 (0)