2016-06-20 45 views
18

Mi sono bloccato con questo bit e non posso progredire - Suppongo che la soluzione sia semplice ma non riesco a capirlo. Sto cercando di aggiungere la voce nel riduttore di modo che i dati in in apparirebbe qualcosa di questo:Redux - Come aggiungere una voce all'array nel riduttore

state = { 
    entryId: { 
    entryName: ["something", "something2", "something3" /* and so on... */] 
    } 
}; 

Finora questo è il più vicino che ricevo, ma, invece di aggiungere nuova voce unica, che sostituisce quello che è già memorizzato. Inoltre ho bisogno di essere in grado di aggiungere questo articolo al stato di vuoto in cui EntryID, entryname non esiste ancora evitare errori:

switch(type) { 
    case ADD_ENTRY: 
    return { 
     ...state, 
     [entryId]: { 
     ...state[entryId], 
     [entryName]: { 
      [uniqueEntry]: true 
     } 
     } 
    }; 
} 

Qualsiasi idea di cosa sto facendo male?

+0

Puoi scrivere un contesto più per l'esempio? Ad esempio, puoi indicare la _shape_ dell'azione che stai utilizzando? –

+0

Sto inviando qualcosa del genere: addEntry ({entryId, entryName, uniqueEntryid}) – eloleon

+0

Prova questo: [link] (https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage -2% 2Cstage-3 & code = const% 20state% 20% 3D% 20% 7B% 0D% 0A% 20% 20entryId% 3A% 20% 7B% 0D% 0A% 20% 20% 20% 20entryName% 3A% 20% 5B % 22something% 22% 2C% 20% 22something2% 22% 2C% 20% 22something3% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B% 0D% 0A% 0D% 0Aconst% 20newState % 20% 3D% 20% 7B% 0D% 0A% 20% 20% 5B% 22entryId% 22% 5D% 3A% 7B% 0D% 0A% 20% 20% 20% 20% 5B% 22entryName% 22% 5D% 3A % 20% 5B ... state% 5B% 22entryId% 22% 5D% 5B% 22entryName% 22% 5D% 2C% 22something4% 22% 5D% 0D% 0A% 20% 20% 7D% 0D% 0A% 7D% 3B % 0D% 0A% 0D% 0Aconsole.log (newState)% 3B & experimental = true & loose = false & spec = false) – jzm

risposta

22

Se stai cercando di aggiungere un elemento alla fine dell'array entryName si dovrebbe fare:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName], 
     uniqueEntry 
    ] 
    } 
}; 

ES6 diffusione con gli array funziona così:

const array1 = [1, 2, 3]; 
const array2 = [4, 5, 6]; 
const eight = 8; 

const newArray = ['stuff', ...array1, 'things', ...array2, ...[7, eight], 9]; 
console.log(newArray); // ["stuff", 1, 2, 3, "things", 4, 5, 6, 7, 8, 9] 

Controllare fuori this gist che ha un esempio di qualcosa di molto simile a quello che stai facendo.

Ho trovato estremamente utile questa serie di esempi. Un sacco di grandi cose qui:

https://github.com/sebmarkbage/ecmascript-rest-spread

Aggiornamento:

Se entryName è inizializzato a undefined come dici nel tuo commento, si potrebbe fare questo:

return { 
    ...state, 
    [entryId]: { 
    ...state[entryId], 
    [entryName]: [ 
     ...state[entryId][entryName] || [], 
     uniqueEntry 
    ] 
    } 
}; 

penso questo è un grande esempio di quanto possa essere doloroso lavorare con React/redux usando una struttura di dati pesantemente annidata. FWIW, mi è stato consigliato molte volte per appiattire il tuo stato il più possibile.

+0

Grazie dannyid! Ho provato la stessa cosa e il problema è che lo stato iniziale è un oggetto vuoto, quindi questa riga '... stato [entryId] [entryName]' genera l'errore – eloleon

+0

Ah, questa è un'informazione importante! Puoi aggiornare la tua domanda e aggiornerò la mia risposta? – jaybee

+0

Aggiornerò ora la domanda.BTW Ho lavorato attorno al mio problema con praticamente lo stesso approccio di "|| []" – eloleon