我建立了下一个减速器结构:
//index.js
import userReducer from "./user";
const initState = {
user: null
};
const rootReducer = (state = initState, action) => {
const {
user
} = state;
if (action === "SIGN_OUT") {
return {
user: userReducer(null, action)
};
}
return {
user: userReducer(user, action)
};
};
export default rootReducer;
//user.js
const initState = {
userId: null,
clientId: null,
type: null
}
const userReducer = (state = initState, action) => {
switch (action.type) {
case "SET_USER_ID" :
const { userId } = action;
return {
...state,
userId
};
case "SET_USER_DATA" :
const { userData } = action;
return {
...state,
...userData
};
default : return state;
};
};
export default userReducer;
显然,我有更多的减速器,是为了简化演示。
我的逻辑是,如果userReducer
的第一个参数是虚假值,它将使用initState
。在rootReducer
中,user
的值为空,因此在userReducer
内部,它应使用initState
作为状态。
不幸的是,我的状态是这样的:
{ user: null }
我在做什么错了?
答案 0 :(得分:2)
仅当传递(r + j) % 60
或不传递任何值时才应用默认参数值。除undefined
外传递null
和其他虚假值将覆盖默认值。 here的更多内容。
正如克里斯海恩在回答中指出的那样,undefined
应该是if (action === "SIGN_OUT")
答案 1 :(得分:1)
在rootReducer
中,您将参数action
用作字符串(“ SIGN_OUT”)。然后,您将此变量传递到userReducer
中,并尝试从action.type
中读取字符串。那可能就是问题所在。
我不确定,但是您似乎试图在rootReducer
中组合多个reducer,对吧?
检查内置的redux函数combineReducers
:https://redux.js.org/api/combinereducers