【发布时间】:2017-03-02 20:33:13
【问题描述】:
我正在使用 ngrx/store 为我的应用程序编写减速器。
这是我的应用程序状态的布局:
{
project: {
name: string
tasks: Array<Task>
}
}
with:
interface Task {
name: string
}
我正在尝试在单独的文件中编写干净的减速器。
这是我目前使用的解决方案:
project.reducer.ts
import {tasksReducer} from './tasks.reducer';
const projectReducer = (state:Project = null, action: Action): Project => {
switch (action.type) {
case 'CREATE_PROJECT':
return {
name :'New project',
tasks: []
};
};
state.tasks = tasksReducer( state.tasks, action );
return state;
}
tasks.reducer.ts
export const tasksReducer = (state:Array<Task> = [], action: Action): Array<Task> => {
switch (action.type) {
case 'ADD_TASK':
return [...state, { name: 'New task' ];
default:
return state;
};
}
使用以下方式提供商店:
StoreModule.provideStore( combineReducers([{
project: projectReducer
}]) );
如果我想在我的项目中添加其他字段,例如标签字段:
{
project: {
name: string,
tasks: Array<Task>,
tags: Array<Tags>
}
}
我可以创建一个单独的tags.reducer.ts,并使用相同的方法创建相应的reducer。
那么这种方法有什么问题呢?
我很确定我在应用程序状态的不变性方面遇到了麻烦。
例子:
- 我调度 CREATE_PROJECT 操作,我得到一个新状态,一切正常。
- 然后我发送一个 ADD_TASK 动作。
- tasksReducer 本身返回一个全新的任务数组,但是主应用程序状态发生了变异......这并不好!
在您看来,解决这个问题的最佳方法是什么?
更一般地说:
随着我的项目对象会随着更多的领域越来越大,我该怎么做:
- 保持减速器分开
- 使减速器在“主”减速器的隔离子部分上运行
- 保持我的状态不可变
我很乐意分享这方面的意见和意见!
【问题讨论】: