スプリットレデューサーを維持しながら、私の状態ツリーのいくつかのトップレベルフィールドを更新する理想的な方法を試しています。スプリットレデューサーで関連する状態フィールドを更新する最も良い方法は?
は、ここで私が作ってみたシンプルなソリューションです。
var state = {
fileOrder: [0],
files: {
0:{
id: 0,
name: 'asdf'
}
}
};
function handleAddFile(state, action) {
return {...state, ...{[action.id]:{id: action.id, name: action.name}}};
};
function addFileOrder(state, action) {
return [...state, action.id];
}
// Adding a file should create a new file, and add its id to the fileOrder array.
function addFile(state, action) {
let id = Math.max.apply(this, Object.keys(state.files)) + 1;
return {
...state,
fileOrder: addFileOrder(state.fileOrder, {id}),
files: handleAddFile(state.files, {id, name: action.name})
};
}
現在、私は、単一のアクション{type: ADD_FILE, fileName: 'x'}
を派遣することができるよ、そしてaddFile
はaddFileOrder
とaddFile
に送信するために内部でアクションを作成します。それは以下のいずれかを行うには良いアプローチと見なされた場合
私は興味があります。
代わりに、ファイルを追加するために、2つのアクション、1を派遣それは、IDのgetとidでADD_TO_FILE_ORDER
アクションを派遣。 に新しいIDを計算させるのではなく、{type: ADD_FILE, name: 'x', id: 1}
のように、火災と行動を にしてください。これにより、私はcombineReducers
を使用し、アクションタイプにフィルタを適用できます。 この例はおそらく些細なものですが、私の実際の状態ツリーはもう少し複雑で、各ファイルもまた他のエンティティに追加する必要があります。
いくつかの追加のコンテキストでは、より完全な状態のツリーは次のようになります。
{
"fileOrder": [0]
"entities": {
"files": {
0: {
id: 0,
name: 'hand.png'
}
},
"animations": {
0: {
id: 0,
name: "Base",
frames: [0]
}
},
"frames": {
0: {
id: 0,
duration: 500,
fileFrames: [0]
}
},
"fileFrames": {
0: {
id: 0,
file: 0,
top: 0,
left: 0,
visible: true
}
}
}
}
する必要がありますファイルを追加:
- は、ファイルのハッシュに追加します。
- fileOrder配列に追加します。
- 各フレームのファイルを参照するfileFrameを追加します。
- それぞれの新しいfileFrameを、作成されたフレームに追加します。
最後の2つの点は、私がcombineReducersをまったく使用できるかどうか疑問に思います。