Sto cercando di elaborare il modo ideale per aggiornare diversi campi di primo livello nella struttura dello stato, pur mantenendo i riduttori di divisione.Il modo migliore per aggiornare i relativi campi di stato con riduttori split?
Ecco una soluzione semplice che ho trovato.
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})
};
}
Attualmente sono in grado di inviare una singola azione {type: ADD_FILE, fileName: 'x'}
, quindi addFile
crea un'azione internamente per inviare addFileOrder
e addFile
.
Sono curioso di sapere se è considerato un approccio migliore per eseguire una delle seguenti operazioni.
Invece di inviare due azioni, una per aggiungere un file, quindi ottenere il suo id e inviare un'azione ADD_TO_FILE_ORDER
con l'id. OPPURE Fuoco e azioni come {type: ADD_FILE, name: 'x', id: 1}
, invece di consentire addFile
per calcolare il nuovo ID. Questo mi permetterebbe di usare combineReducers
e filtrare sul tipo di azione. Questo esempio è probabilmente banale, ma il mio albero di stato attuale è un po 'più complicato, con ogni file aggiunto che deve essere aggiunto ad altre entità.
Per un ulteriore contesto, un albero di stato più completo sarebbe simile a questo.
{
"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
}
}
}
}
Aggiunta di un file avrebbe bisogno di:
- aggiungerlo al file hash.
- Aggiungilo all'array fileOrder.
- Aggiungere un fileFrame che fa riferimento al file, per ciascun fotogramma.
- Aggiungi ogni nuovo fileFrame al frame per il quale è stato creato.
Gli ultimi due punti mi chiedo se sarei in grado di utilizzare CombinaRiduttori affatto.