【发布时间】:2016-10-23 06:14:33
【问题描述】:
首先,我明白这是一种变异的状态变化;我知道我很丢脸。有时正确的方法似乎不是最聪明的,或者我至少不知道更好。
让我解释一下,我不想在不为预定义项目创建和交换旧状态和新状态的情况下将密钥注入我的状态。我只是想注入密钥一段时间,如果我不这样做,那么无论如何它们都会被清除。我的初始状态看起来像
{graphSite: {site: "default", graphBrowser: { graphID: '', graphKey:'' }, browsable:[] }};
我的 reducer 看起来像这样 **使用 babel es7 对象扩展运算符
case BROWSER: { state.graphSite.browsable[action.id] = action.payload
return {...state}
}
所以这会起作用,但是 redux 开发工具没有显示状态变化,尽管可浏览的数组是可访问的,这可能是因为我违背了规律,但如果我将更改扩展到:
case BROWSER: { state.graphSite.browsable[action.id] = action.payload
return {...state,
graphSite: {...state.graphSite,
graphBrowser: {...state.graphSite.graphBrowser},
browsable: {...state.graphSite.browsable} }
}
}
现在可在工具中正确显示可浏览,但理想情况下,这些是相同的。
所以问题是,对于不处于初始存储状态的动态键,操作状态的最佳方法是什么。这行得通,感觉就像我做错了什么,因为我操纵了原始状态。
【问题讨论】:
-
你正在改变状态本身。
state.graphSite.browsable[action.id] = action.payload。您需要对状态进行深层复制,并按照您的方式改变副本,然后返回副本 -
我希望动作 ID 足够动态,我不必跟踪可能的初始状态来更改。问题是没有什么可复制的,除非你改变原件并将其作为新的返回。否则 id 做正常的对象传播和我想要改变的部分。这主要是为了关键,因为如果这是一个数组,我不能保证异步调用的顺序