createStore()
. Чтобы объединить несколько редукторов вместе, Redux предоставляет метод combineReducers()
. Этот метод принимает объект как аргумент, в котором вы определяете свойства, которые связывают ключи с конкретными функциями редуктора. Имя, которое вы передаете клавишам, будет использоваться Redux как имя связанного участка состояния. Как правило, хорошей практикой является создание редуктора для каждой части состояния приложения, когда они являются определенными или уникальными в некотором роде. Например, в приложении для заметок с аутентификацией пользователя один редуктор может обрабатывать аутентификацию, а другой - текст и заметки, которые пользователь отправляет. Для такого приложения мы можем написать метод combineReducers()
следующим образом: const rootReducer = Redux.combineReducers ({Теперь ключевые
auth: authenticationReducer,
примечания: примечанияReducer
});
notes
будут содержать все состояние, связанное с нашими заметками и обрабатываемое нашими notesReducer
. Так можно создать несколько редукторов для управления более сложным состоянием приложения. В этом примере состояние, хранящееся в хранилище Redux, будет тогда единственным объектом, содержащим свойства auth
и notes
. counterReducer()
имеются функции counterReducer()
и authReducer()
, а также хранилище Redux. Завершите запись функции rootReducer()
с помощью Redux.combineReducers()
. Назначьте counterReducer
ключу с именем count
и authReducer
на ключ с именем auth
. counterReducer
должен увеличивать и counterReducer
state
.
testString: 'assert((function() { const initalState = store.getState().count; store.dispatch({type: INCREMENT}); store.dispatch({type: INCREMENT}); const firstState = store.getState().count; store.dispatch({type: DECREMENT}); const secondState = store.getState().count; return firstState === initalState + 2 && secondState === firstState - 1 })(), "The counterReducer
should increment and decrement the state
.");'
- text: authReducer
должен переключать state
authenticated
между true
и false
.
testString: 'assert((function() { store.dispatch({type: LOGIN}); const loggedIn = store.getState().auth.authenticated; store.dispatch({type: LOGOUT}); const loggedOut = store.getState().auth.authenticated; return loggedIn === true && loggedOut === false })(), "The authReducer
should toggle the state
of authenticated
between true
and false
.");'
- text: 'Магазин state
должно иметь два ключа: count
, который содержит номер и auth
, который содержит объект. Объект auth
должен иметь свойство authenticated
, которое содержит логическое значение.'
testString: 'assert((function() { const state = store.getState(); return typeof state.auth === "object" && typeof state.auth.authenticated === "boolean" && typeof state.count === "number" })(), "The store state
should have two keys: count
, which holds a number, and auth
, which holds an object. The auth
object should have a property of authenticated
, which holds a boolean.");'
- text: 'rootReducer
должен быть функцией, которая объединяет counterReducer
и authReducer
.'
testString: 'getUserInput => assert((function() { const noWhiteSpace = getUserInput("index").replace(/\s/g,""); return typeof rootReducer === "function" && noWhiteSpace.includes("Redux.combineReducers") })(), "The rootReducer
should be a function that combines the counterReducer
and the authReducer
.");'
```