为什么我的Redux State嵌套了?

时间:2017-04-23 17:29:59

标签: reactjs redux

我正在编写我的第一个更大的React / Redux / Meteor App。我知道在流星应用程序中不一定需要Redux,但我想使用它。

我使用Meteor从MongoDB加载记录,然后我想将此对象存储在我的Redux存储中。但是对象嵌套在商店中,我不知道为什么会这样。

到目前为止,这是我的代码:

操作加载远程记录

export const loadRecord = (id) => {
    return dispatch => {
        Meteor.call('loadRecord', id, (error, result) => {
             if (!error) {
                dispatch({
                    type: TYPE,
                    result
                });
            } else {
                dispatch({
                    type: TYPE_ERROR,
                    error,
                });
            }

        });
    };
};

Reducer 应该更新我的商店

const initialState = {
    singleRecord: {}
};

export function singleRecord(state = initialState, action) {    
    switch (action.type) {
        case TYPE:
            return {
                ...state,
                singleRecord: action.result
            };
        default:
        return state;
    }
}

在更多商店我希望这样的事情:

singleRecord: {
    id:"1223",
    text:"abcde"
}

我得到是:

singleRecord: {
    singleRecord {
        id:"1223",
        text:"abcde"
    }
}

所以我的商店得到更新,除了事实之外,一切都按预期工作,我的记录以某种方式嵌套。 我想我错过了一个基本的东西,或者我错了。如果有人可以解释我这是否是预期的行为,或者如果没有,可以告诉我为什么我的代码没有按预期工作,这将是非常好的。

提前致谢

1 个答案:

答案 0 :(得分:1)

您想要解开操作的有效负载:

return {
    ...state,
    ...action.result
};

或换句话说:

return Object.assign({}, state, action.result);

我不确定您希望在singleRecord中保存哪些内容,但您完全有可能想要这样做:

return action.result;

此外,您的初始状态应为const initialState = {};

singleRecord缩减器返回的对象是存储在singleRecord状态的对象。