在开发DvaJS构建的项目时,有五个要素是一定要掌握的。
- namespace - - 命名空间
- state - - 数据状态
- reducer - - 修改状态
- effect
- subscripition
Reducer:
reducer是一个函数,接收state 和 action,返回老的或新的state。即: (state, action) => state
增删改:
以todos为例:
app.model({
namespace: 'todos,
state: [],
reducers: {
add(state, { payload: todo }) {
return state.concat(todo);
},
remove(state, { payload: id }) {
state.filter(todo => todo.id !== id);
},
update(state, { payload: updatedTodo }) {
return state.map(todo => {
if (todo.id === updatedTodo.id) {
return { ...todo, updatedTodo };
} else {
return todo;
}
});
},
},
})
嵌套数据的增删改
建议最多一层嵌套,以保持state的扁平化,深层嵌套会让reducer很难写和难以维护。
app.model({
namespace: 'app',
state: {
todos: [],
loading: false,
},
reducers: {
add(state, { payload: todo }) {
const todos = state.todos.concat(todo);
return { ...state, todos };
},
},
});
下面是深层嵌套的例子,应尽量避免。
app.model({
namespace: 'app',
state: {
a: {
b: {
todos: [],
loading: false,
},
},
},
reducers: {
add(state, { payload: tod }) {
const todos = state.a.b.todos.concat(todo);
const b = { ...state.a.b, todos };
const a = { ...state.a, b};
return { ...state, a };
},
},
});