我有一个对象存储为url中的键,值对作为查询参数。该对象的键可能会更改,我想使用该对象中的每个键值对来更新redux应用程序中state
对象的键值对。我需要以不改变state
对象的方式这样做,并且我正在尝试如下实现此目标:
case 'LOAD_SEARCH_FROM_URL':
let _state = Object.assign({}, state);
const args = action.obj.substring(1).split('&');
args.map((arg) => {
const split = arg.split('=');
_state = Object.assign({}, _state, {
[split[0]]: JSON.parse( decodeURIComponent( split[1] ) )
})
})
return _state;
这在简单测试中工作正常,但我想确保这实际上不执行任何突变。对于其他人可以提出的有关此问题的任何见解,我将不胜感激!
不,Object.assign只会改变目标(第一个参数),在你的情况下是一个新创建的空对象。源(所有后续参数)将不会被修改。
要非常小心,如果它们是深层嵌套的,则指定mutate对象。它写在文档中,所以你应该检查你的数据结构。
对于深度克隆,我们需要使用其他替代方法,因为Object.assign()复制属性值。如果源值是对象的引用,则它仅复制该引用值。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
如果你有嵌套状态,如{a:0,b:{c:0}},那么在更改后redux将无法检测到这样的事情:
const mapStateToProps = state => {
return {
value: state[YOUR_REDUCER_NAME].a.b
}
}
connect(mapStateToProps)(Component)