一般来说,描述一个state通常通过一个普通的js对象来描述。比如说角色列表模块的state:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
accounts:[
{
id: 1,
name: 'John',
enable: true
},{
id: 2,
name: 'Bob',
enable: true
},{
id: 3,
name: 'Lina',
enable: false
}
],
subscription: '管理员'
}

这样写就处于写死的状态,没有任何修改器方法(setter)可以去修改它,对于界面简单,逻辑不复杂的应用没有什么问题,但是对于复杂且庞大的应用,就会出现状态逻辑混乱,难以维护的问题。那么,我们要想更新state,就要发起一个action,这里的Action也是一个普通的js对象,只是用来描述发生了什么,注意这里仅仅是描述。比如:

1
2
3
{type: "MODIFY_SUBSCRIPT", text: "用户"}
{type: "MODIFY_ACCOUNT", data: {id: 2, name: 'Toy'}}
{type: "ADD_ACCOUNT", data: {name: 'Lisa', enable: true}}

最后,为了把state和action联系起来,需要开发一些函数,函数接受state和action,这些函数就是reducer,并返回新的state。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function changeText(state='管理员', action){
if(action.type = "MODIFY_SUBSCRIPT"){
state.subscription = action.text
return state
}else{
return state
}
}

function accounts(state=[], action){
switch(action.type){
case 'ADD_ACCOUNT':
return state.contact([id: 4, name: action.data.name, enable: action.data.enable])
case 'MODIFY_ACCOUNT':
return state.map((v, i)=>{
if(v.id === action.data.id){
v.name = action.data.name
v.enable = action.data.enable || true
}
})

default:
return state
}
}

再使用一个全局reducer来管理调用这些reducer。

1
2
3
4
5
6
function globalReducer(state = {}, action){
return{
changeText: changeText(state.subscription, action),
accounts: accounts(state.accounts, action)
}
}

以上就是Redux的核心概念,可以看出,Redux没有使用那些晦涩难懂的东西,90%都是纯javascript代码。