Se si dispone di un solo riduttore, non hai bisogno di combineReducers()
. Basta usare direttamente:
const initialState = {
sources: [],
left: {},
right: {}
}
function app(state = initialState, action) {
switch (action.type) {
case 'ADD_SOURCE':
return Object.assign({}, state, {
sources: [...state.sources, action.newSource]
})
case 'ADD_SOURCE_TO_LEFT':
return Object.assign({}, state, {
left: Object.assign({}, state.left, {
[action.sourceId]: true
})
})
case 'ADD_SOURCE_TO_RIGHT':
return Object.assign({}, state, {
right: Object.assign({}, state.right, {
[action.sourceId]: true
})
})
default:
return state
}
}
ora è possibile creare un archivio con quella riduttore:
import { createStore } from 'redux'
const store = createStore(app)
e collegare un componente ad esso:
const mapStateToProps = (state) => ({
sources: state.sources
})
Tuttavia, il vostro riduttore è difficile da leggere perché aggiorna molte cose diverse contemporaneamente. Ora, questo è il momento in cui si desidera dividere in diversi riduttori indipendenti:
function sources(state = [], action) {
switch (action.type) {
case 'ADD_SOURCE':
return [...state.sources, action.newSource]
default:
return state
}
}
function left(state = {}, action) {
switch (action.type) {
case 'ADD_SOURCE_TO_LEFT':
return Object.assign({}, state, {
[action.sourceId]: true
})
default:
return state
}
}
function right(state = {}, action) {
switch (action.type) {
case 'ADD_SOURCE_TO_RIGHT':
return Object.assign({}, state, {
[action.sourceId]: true
})
default:
return state
}
}
function app(state = {}, action) {
return {
sources: sources(state.sources, action),
left: left(state.left, action),
right: right(state.right, action),
}
}
Questo è più facile da mantenere e capire, e rende anche più facile cambiare e riduttori di test in modo indipendente.
Infine, come ultimo passaggio, possiamo usare combineReducers()
per generare il riduttore radice app
invece di scrivere a mano:
// function app(state = {}, action) {
// return {
// sources: sources(state.sources, action),
// left: left(state.left, action),
// right: right(state.right, action),
// }
// }
import { combineReducers } from 'redux'
const app = combineReducers({
sources,
left,
right
})
Non c'è grande vantaggio di utilizzare combineReducers()
invece di scrivere il riduttore di root mano tranne che è leggermente più efficiente e probabilmente ti farà risparmiare alcuni errori di battitura. Inoltre, puoi applicare questo modello più di una volta nella tua app: è bene combinare riduttori non collegati in un unico riduttore più volte in modo annidato.
Tutto questo refactoring non avrebbe alcun effetto sui componenti.
vorrei suggerire di guardare la mia free Egghead course on Redux che copre questo modello di composizione riduttore e mostra come combineReducers()
implementata.
il codice è corretto 'state.appReducer. fonti 'è necessario il nome del riduttore –
Immaginate di avere 2,3 riduttori ogni riduttore ha la proprietà' sources' –
potete ottenere 'sources' specifici da' state.appReducer. sources' e 'state.appReducer.2 sources' –