--- id: 5a24c314108439a4d4036150 title: Handle an Action in the Store challengeType: 6 isRequired: false videoUrl: '' localeTitle: 处理商店中的操作 --- ## Description
创建并分派操作后,Redux存储需要知道如何响应该操作。这是reducer功能的工作。 Redux中的Reducers负责响应操作而进行的状态修改。 reducerstateaction作为参数,并且它总是返回一个新state 。重要的是要看到这是减速器的唯一作用。它没有任何副作用 - 它从不调用API端点,它从来没有任何隐藏的意外。 reducer只是一个纯函数,它接受状态和动作,然后返回新状态。 Redux的另一个关键原则是state是只读的。换句话说, reducer函数必须始终返回一个新的state副本,而不是直接修改状态。 Redux不强制执行状态不变性,但是,您负责在reducer函数的代码中强制执行它。你将在以后的挑战中练习这一点。
## Instructions
代码编辑器具有前面的示例以及为您启动reducer功能。填写reducer函数的主体,这样如果它收到'LOGIN'类型的动作,它将返回一个login设置为true的状态对象。否则,它返回当前state 。请注意,当前state和调度的action将传递给reducer,因此您可以使用action.type直接访问操作的类型。
## Tests
```yml tests: - text: 调用函数loginAction应该返回一个对象,其type属性设置为字符串LOGIN 。 testString: 'assert(loginAction().type === "LOGIN", "Calling the function loginAction should return an object with type property set to the string LOGIN.");' - text: 应使用属性login设置为false的对象初始化存储。 testString: 'assert(store.getState().login === false, "The store should be initialized with an object with property login set to false.");' - text: 调度loginAction应该将store状态中的login属性更新为true 。 testString: 'assert((function() { const initialState = store.getState(); store.dispatch(loginAction()); const afterState = store.getState(); return initialState.login === false && afterState.login === true })(), "Dispatching loginAction should update the login property in the store state to true.");' - text: 如果操作不是LOGIN类型,则存储应返回当前状态。 testString: 'assert((function() { store.dispatch({type: "__TEST__ACTION__"}); let afterTest = store.getState(); return typeof afterTest === "object" && afterTest.hasOwnProperty("login") })(), "If the action is not of type LOGIN, the store should return the current state.");' ```
## Challenge Seed
```jsx const defaultState = { login: false }; const reducer = (state = defaultState, action) => { // change code below this line // change code above this line }; const store = Redux.createStore(reducer); const loginAction = () => { return { type: 'LOGIN' } }; ```
## Solution
```js // solution required ```