下記のRedux還元剤コード(主にUPDATE_TASK
アクションとupdateTask
還元剤機能に注意してください)では、私は自分の状態オブジェクトに単一のproject
を保存します。このproject
には複数のmilestones
があり、順番には複数のtasks
があります。還元還元剤の改善
特定のタスクを更新すると、私はUPDATE_TASK
アクションをトリガーしています。その後、PUT
要求を実行し、task
の更新版をペイロードとして受信します。
次に、project
オブジェクトのmilestones
をすべて自分の状態から繰り返します。それがタスクのmilestone_id
と一致する場合は、そのマイルストーンのtasks
をすべて反復して、前のすべてのタスクを含むコレクションを作成し、応答から得たものを置き換えます。
これは、Reduxを使用して変更された状態を構築するアプローチに最も適していますか?また、私がやっているような非自明な状態更新のための関数を抽出することをお勧めしますか?私のコード(私が気づいていない文法やES6の練習のいずれか)で改善できる点は?
import { FETCH_PROJECT } from '../actions/index';
import { FETCH_PROJECTS } from '../actions/index';
import { FETCH_MILESTONES } from '../actions/index';
import { FETCH_TASKS } from '../actions/index';
import { UPDATE_TASK } from '../actions/index';
const INITIAL_STATE = { all: [], project: null, milestones: [] };
// injects a collection of tasks on the milestone that
// matches the id we're using to fetch
function updateTasks(state, action) {
const milestones = state.project.milestones.map((milestone) => {
if (milestone.id == action.meta.id) {
return { ...milestone, tasks: action.payload.data.tasks }
}
return milestone;
});
const project = { ...state.project, milestones };
return { ...state, project };
}
// updates a single task on the proper milestone
function updateTask(state, action) {
const { task } = action.payload.data;
const milestones = state.project.milestones.map((milestone) => {
if (milestone.id == task.milestone_id) {
const tasks = milestone.tasks.map((milestoneTask) => {
if (milestoneTask.id == task.id) {
return task;
}
return milestoneTask;
});
return { ...milestone, tasks: tasks };
}
return milestone;
});
const project = { ...state.project, milestones };
return { ...state, project };
}
export default function(state = INITIAL_STATE, action) {
switch (action.type) {
case FETCH_PROJECT:
return { ...state, project: action.payload.data.project };
case FETCH_PROJECTS:
return { ...state, all: action.payload.data.projects };
case FETCH_MILESTONES:
return { ...state, milestones: action.payload.data.milestones };
case FETCH_TASKS:
return updateTasks(state, action);
case UPDATE_TASK:
return updateTask(state, action);
}
return state;
}