Я построил следующую структуру редуктора:
//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 }
Что я делаю неправильно?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


в rootReducer вы используете параметр action как строку ("SIGN_OUT"). Затем вы передаете эту переменную в userReducer и пытаетесь прочитать строку из action.type. Вот наверное проблема.
Я не уверен, но кажется, что вы пытаетесь объединить несколько редукторов в rootReducer, верно?
Проверьте встроенную редукционную функцию combineReducers: https://redux.js.org/api/combineducers
Значения аргументов по умолчанию применяются только тогда, когда undefined или значение не передается. Передача null и других ложных значений, кроме undefined, переопределит значение по умолчанию. Подробнее об этом здесь.
Также, как указал Кришейн в своем ответе, if (action === "SIGN_OUT") должно быть if (action.type === "SIGN_OUT")
Хорошо указать на
action.typeвместоaction, но я не думаю, что это имеет отношение к проблеме, так как я не отправляю никаких действий, просто вызывается@@INIT, гдеrootReducerдолжен просто передаватьnullв качестве первого параметраuserReducer, который должен вернуть егоinitStateback. Я не использую combReducers, так как хочу инициализировать состояние, еслиaction.type === "SIGN_OUT"