Я пишу редукторы для своего приложения с помощью 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 и использовать тот же подход для создания соответствующего редуктора.
Так что же плохого в таком подходе?
Я почти уверен, что у меня проблемы с неизменяемостью состояния моего приложения.
Пример:
- Я отправляю действие CREATE_PROJECT, получаю новое состояние, и все в порядке.
- Then i dispatch a ADD_TASK action.
- The tasksReducer itself return a brand new array of tasks, BUT the main application state is mutated ... And that is not good !
Как вы считаете, как лучше всего решить эту проблему?
В более общем смысле:
Поскольку мой объект проекта будет становиться все больше и больше с большим количеством полей, как я могу:
- Держите редуктор отдельно
- Заставить редуктор работать на изолированной части «основного» редуктора.
- Держите мое состояние неизменным
Буду рад поделиться хоть и мнениями по этому поводу!