2016-04-12 40 views
12

Per esempio ...Si può o si deve usare localStorage nello stato iniziale di Redux?

export const user = (state = { 
    id: localStorage.getItem('id'), 
    name: localStorage.getItem('name'), 
    loggedInAt: null 
}, action) => { 
    case types.LOGIN: 
     localStorage.setItem('name', action.payload.user.name); 
     localStorage.setItem('id', action.payload.user.id); 
     return { ...state, ...action.payload.user } 

    default: 
     return { ...state, loggedInAt: Date.now() } 
} 

Questa è una versione ridotta di quello che sto facendo, di default restituisce lo stato da localStorage come previsto. Tuttavia, lo stato della mia applicazione è in realtà vuoto una volta che aggiorno la pagina.

+0

Che vuol dire '' si dovrebbe? a seconda delle esigenze dell'applicazione. –

+0

@AvraamMavridis se in qualche modo sembra una cattiva pratica. –

risposta

22

Redux createStore secondo param è destinato per il deposito di inizializzazione:

createStore(reducer, [initialState], [enhancer]) 

modo da poter fare qualcosa di simile:

const initialState = { 
    id: localStorage.getItem('id'), 
    name: localStorage.getItem('name'), 
    loggedInAt: null 
}; 

const store = createStore(mainReducer, initialState); 

Dal riduttori dovrebbero essere le funzioni di puro, ovvero senza effetti collaterali, e localStorage.setItem è un effetto collaterale, che sicuramente danneggerà i test, dovresti evitare di salvare in localStorage in un riduttore. Invece si può:

store.subscribe(() => { 
    const { id, name } = store.getState(); 

    localStorage.setItem('name', name); 
    localStorage.setItem('id', id); 
}); 

Questo accadrà ogni volta che cambia di stato, quindi potrebbe influire sulle prestazioni.

Un'altra opzione è quella di salvare lo stato solo quando la pagina è chiusa (conteggi di aggiornamento) utilizzando onBeforeUnload:

window.onbeforeunload =() => { 
    const { id, name } = store.getState(); 

    localStorage.setItem('name', name); 
    localStorage.setItem('id', id); 
}; 
+0

Questo è perfetto! Grazie mille! –

+0

E ancora un'altra opzione è quella di utilizzare qualcosa come pouchDB e couchDB con middleware per mantenere il negozio senza stato. – ZekeDroid