Javascript 如何对多维对象使用Redux操作?

Javascript 如何对多维对象使用Redux操作?,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我有一个简单的操作来设置n1维中的状态 我的state对象和reducer如下所示 const F2F = { openF2F: false, ... } const initialState = { showModal: false, F2F, ... } export default function reducer(state=initialState, action) {

我有一个简单的操作来设置n1维中的状态 我的state对象和reducer如下所示

    const F2F = {
        openF2F: false,
        ...
    }

    const initialState = {
        showModal: false,
        F2F,
        ...
    }

export default function reducer(state=initialState, action) {
    switch (action.type) {

        case psActions.ON_CHANGE:
            return {
                ...state,
                [action.fieldName]: action.value
            }

        default:
            return state
  }
}
我有一个问题,如何使一个行动指向国家对象

export function onChangeDim(value, name, dimension) {
    return {
        type:      psActions.ON_CHANGE,
        fieldName: dimension[name],//Tried many things her
        value:     value
    }
}
更新 现在我知道如何指向F2F对象了

case psActions.ON_CHANGE_DIM:
    return {
        ...state,
        [action.dimension]: {
            [action.fieldName]:action.value
        }
    }
但不知道如何在F2F中通过其余状态。因为现在当我设定一个状态时,里面只有一个
有人能帮我吗

尝试下面的程序块来解决嵌套状态问题

如果你用的是巴别塔,看起来你就是

return {
    ...state,
    [action.dimension]: {
        ...state[action.dimension],
        [action.fieldName]:action.value
    }
}
Object.assign{},state[action.dimensions],{…}可以用其他方式

编辑:处理您的评论

请查看MDN上关于的文档

Object.assign方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象

所以在这个例子中:Object.assign{},state[action.dimensions],{…}我们将获取一个空对象{},并将state[action.dimensions]中的所有可枚举和自身属性分配给它。然后,我们从{…}中获取可枚举和自己的属性,并将它们应用于更新的对象

合并具有相同属性的对象

这些特性将被以后按参数顺序具有相同特性的其他对象覆盖

这就是当你使用babel插件时…对象被转换成的东西

深度克隆警告

对于深度克隆,我们需要使用其他替代方法,因为Object.assign复制属性值。如果源值是对对象的引用,则仅复制该引用值


在这种情况下,尺寸参数是什么样的?传递给onChangeDim的是什么?@dpaulus'F2F'我需要指向initialState.F2F.state如果action.fieldName==F2F,那么action.value将是新状态。F2F@KyleRichardson是的,你是对的。看看我的最新作品!你能解释更多关于Object.assignstate[action.dimensions],{…}无法使其工作请看一下我的编辑,准备添加一些内容。Object.assign{},state[action.dimensions],{…},其中{…}是您的新属性。Object.assign是否比我的方法更好?一点也不。这就是你的方法在幕后进行的方式。这就是你的代码所传递到的内容。事实上,我一直在使用巴贝尔插件,巴贝尔太棒了!为了完整起见,我加入了它,这样它可以帮助其他不使用babel插件的人解决同样的问题。