--- id: 5a24c314108439a4d4036154 title: Combine Multiple Reducers challengeType: 6 isRequired: false videoUrl: '' localeTitle: Объединение нескольких редукторов --- ## Description
Когда состояние вашего приложения начинает становиться более сложным, может возникнуть соблазн разделить состояние на несколько частей. Вместо этого запомните первый принцип Redux: все состояние приложения хранится в одном объекте состояния в хранилище. Поэтому Redux обеспечивает композицию редуктора как решение для сложной модели состояния. Вы определяете несколько редукторов для обработки разных частей состояния вашего приложения, а затем объединяете эти редукторы в один редуктор корня. Корневой редуктор затем передается в метод Redux createStore() . Чтобы объединить несколько редукторов вместе, Redux предоставляет метод combineReducers() . Этот метод принимает объект как аргумент, в котором вы определяете свойства, которые связывают ключи с конкретными функциями редуктора. Имя, которое вы передаете клавишам, будет использоваться Redux как имя связанного участка состояния. Как правило, хорошей практикой является создание редуктора для каждой части состояния приложения, когда они являются определенными или уникальными в некотором роде. Например, в приложении для заметок с аутентификацией пользователя один редуктор может обрабатывать аутентификацию, а другой - текст и заметки, которые пользователь отправляет. Для такого приложения мы можем написать метод combineReducers() следующим образом:
const rootReducer = Redux.combineReducers ({
auth: authenticationReducer,
примечания: примечанияReducer
});
Теперь ключевые notes будут содержать все состояние, связанное с нашими заметками и обрабатываемое нашими notesReducer . Так можно создать несколько редукторов для управления более сложным состоянием приложения. В этом примере состояние, хранящееся в хранилище Redux, будет тогда единственным объектом, содержащим свойства auth и notes .
## Instructions
В counterReducer() имеются функции counterReducer() и authReducer() , а также хранилище Redux. Завершите запись функции rootReducer() с помощью Redux.combineReducers() . Назначьте counterReducer ключу с именем count и authReducer на ключ с именем auth .
## Tests
```yml tests: - text: 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.");' ```
## Challenge Seed
```jsx const INCREMENT = 'INCREMENT'; const DECREMENT = 'DECREMENT'; const counterReducer = (state = 0, action) => { switch(action.type) { case INCREMENT: return state + 1; case DECREMENT: return state - 1; default: return state; } }; const LOGIN = 'LOGIN'; const LOGOUT = 'LOGOUT'; const authReducer = (state = {authenticated: false}, action) => { switch(action.type) { case LOGIN: return { authenticated: true } case LOGOUT: return { authenticated: false } default: return state; } }; const rootReducer = // define the root reducer here const store = Redux.createStore(rootReducer); ```
## Solution
```js // solution required ```