Aşağıdaki Redux redüktör kodunda (UPDATE_TASK
eylemine ve esas olarak updateTask
redüktör fonksiyonuna dikkat edin), tek bir project
durum satırımda tutuyorum. Bu project
'un birden fazla milestones
vardır; bu, sırası ile birden çok tasks
'a sahiptir.Redux redüktörlerinin iyileştirilmesi
Verilen bir görevi güncelleştirdiğimde, UPDATE_TASK
eylemini tetikliyorum. Daha sonra bir PUT
isteği gerçekleştirir ve task
'un güncellenmiş sürümünü, faydalı yük olarak alır.
Sonraki aşamada, project
nesnesinin milestones
nesnesinin tümünü durumumdan yineliyorum. Görevin milestone_id
ile eşleşmesi durumunda, bu dönüm noktasının tasks
tümünün üzerinden yinelemeye devam ederek, önceki tüm görevleri içeren bir toplama oluşturarak yanıtı aldığımdan değiştiririm.
Redux'u kullanarak değiştirilmiş durumu oluşturmaya yaklaşmanın en iyi yolu bu mu? Ayrıca, yaptığım gibi önemsiz olmayan durum güncellemeleri için işlevler çıkarılması tavsiye edilir mi? Kodumda ne geliştirilebilir (ya stilist ya da farkında olmadığım ES6 numaraları)?
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;
}