Redux не инициализирует состояние - PullRequest
0 голосов
/ 16 марта 2019

Я построил следующую структуру редуктора:

//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 }

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Значения аргумента по умолчанию применяются только тогда, когда undefined или значение не передано.Передача null и других ложных значений помимо undefined переопределяет значение по умолчанию.Подробнее об этом здесь .

Кроме того, как указал в своем ответе Кришейн, if (action === "SIGN_OUT") должно быть if (action.type === "SIGN_OUT")

1 голос
/ 16 марта 2019

in rootReducer Вы используете параметр action в качестве строки ("SIGN_OUT").Затем вы передаете эту переменную в userReducer и пытаетесь прочитать строку из action.type.Это, вероятно, проблема.

Я не уверен, но кажется, что вы пытаетесь объединить несколько редукторов в rootReducer, верно?

Проверьте функцию buildin redux combineReducers: https://redux.js.org/api/combinereducers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...