Измените только одно значение и оставьте другое нетронутым Redux - PullRequest
0 голосов
/ 30 апреля 2020

Много ответов на вопрос о том, как изменить одно значение, но я до сих пор не могу понять, как изменить только значение type только для Ma c и сохранить другие значения без изменений.

const initialStateMac = {
    type: MacBook,
    os: MacOS
};

const initialStatePc = {
    type: Laptop,
    os: Windows
};

const rootReducer = combineReducers({
    mac: macReducers,
    pc: pcReducers
});

const store = createStore(rootReducer);

export const Mac = (state = initialStateMac, action) => {
    switch (action.type) {
        case "SET_DEVICE_TYPE":
            return {
                ...state,
                type: action.payload
            };
        default:
            return state;
    }
};

export const Pc = (state = initialStatePc, action) => {
    switch (action.type) {
        case "SET_DEVICE_TYPE":
            return {
                ...state,
                type: action.payload
            };
        default:
            return state;
    }
};

{
    type: "SET_DEVICE_TYPE",
    payload: "ddd"
}

, чтобы быть ясным, я хочу получить:

    Mac: {
        type: ddd,
        os: MacOS
    },
    Pc: {
        type: Laptop,
        os: Windows
    }

, но не:

    Mac: {
        type: ddd,
        os: MacOS
    },
    Pc: {
        type: ddd,
        os: Windows
    }

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

В случае с несколькими редукторами самым простым решением было бы просто использовать разные типы действий для каждого редуктора соответственно

Ответ ниже был дан с предположением, что 1 редуктор использовался с initalState {Mac: {type: "", os: ""}, PC: {type: "", os:""}}

Если вы хотите специально изменить атрибут типа объекта с помощью клавиши "Ma c", вы можете использовать это.

export default (state = intialState, action) => {
    switch (action.type) {
        case "SET_DEVICE_TYPE":
            const {Mac} = state;
            return {
                ...state,
                Mac: {
                   ...Mac,
                   type: action.payload
                }
            };
        default:
            return state;
    }
};

Примечание: Если вы хотите специально изменить тип атрибут объекта с ключом "Ma c", тогда было бы лучше, если бы тип действия был похож на "SET_MAC_DEVICE_TYPE"

Также, если ключ должен быть динамическим c -

// action.payload = {key: "Mac", type: "ddd"}

export default (state = intialState, action) => {
    switch (action.type) {
        case "SET_DEVICE_TYPE":
            const initValue = state[action.payload.key];
            return {
                ...state,
                [action.payload.key]: {
                   ...initValue,
                   type: action.payload.type
                }
            };
        default:
            return state;
    }
};
0 голосов
/ 30 апреля 2020

Передать initialState.Ma c в редуктор в качестве состояния по умолчанию

export default (state = initialState.Mac, action) => {
    switch (action.type) {
        case "SET_DEVICE_TYPE":
            return {
                ...state,
                type: action.payload
            };
        default:
            return state;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...