Wenn Sie nur ein einziges Minderer haben, müssen Sie combineReducers()
nicht brauchen. direkt verwenden Sie es einfach:
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
}
}
Jetzt haben Sie ein Geschäft mit diesem Minderer erstellen:
import { createStore } from 'redux'
const store = createStore(app)
und eine Komponente mit ihm verbinden:
const mapStateToProps = (state) => ({
sources: state.sources
})
jedoch Ihre Minderer schwer zu lesen weil es viele verschiedene Dinge auf einmal aktualisiert. Nun diese ist der Moment, den Sie es in mehrere unabhängige Reduzierungen teilen möchten:
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),
}
}
Dies ist leichter zu pflegen und zu verstehen, und es macht es auch leichter, sie zu ändern und Test Reduzierungen unabhängig.
schließlich als letzten Schritt können wir combineReducers()
verwenden, um die Wurzel app
Minderer, anstatt sie von Hand schreiben zu generieren:
// 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
})
Es gibt keine große Vorteil ist, combineReducers()
zu verwenden anstelle des Schreibens der Wurzel Minderer durch Hand, außer dass es etwas effizienter ist und Ihnen wahrscheinlich ein paar Tippfehler ersparen wird. Sie können dieses Muster auch mehrfach in Ihrer App anwenden: Es ist in Ordnung, nicht zusammenhängende Reduzierungen mehrere Male in einem einzigen Reduzierer verschachtelt zu kombinieren.
Dieses Refactoring hätte keine Auswirkungen auf die Komponenten.
Ich würde vorschlagen, dass Sie meine free Egghead course on Redux zu sehen, die dieses Muster der Minderer Zusammensetzung umfasst und zeigt, wie combineReducers()
umgesetzt wird.
Ihr Code ist korrekt 'state.appReducer. Sources' Sie brauchen den Reducer Name –
Stellen Sie sich vor, Sie haben 2,3 Reduzierungen jeder Reducer hat 'sources' Eigenschaft –
Sie können spezifische' sources' durch 'state.appReducer bekommen. sources' und 'state.appReducer.2 sources' –