Javascript 使用Redux替换减速器内的整个状态
标题听起来像是有线的,但是如果我从服务器和reducer中收集数据,我只想返回这些数据并将它们设置为新状态,会发生什么呢 例如,从后端获取数据。如果我想这样替换它,我真的需要复制上一个状态吗:Javascript 使用Redux替换减速器内的整个状态,javascript,reactjs,redux,Javascript,Reactjs,Redux,标题听起来像是有线的,但是如果我从服务器和reducer中收集数据,我只想返回这些数据并将它们设置为新状态,会发生什么呢 例如,从后端获取数据。如果我想这样替换它,我真的需要复制上一个状态吗: export function accountData(state = [], action) { switch (action.type) { case FETCH_FAILURE: console.error('SOMETHING BAD JUST HAPPENED');
export function accountData(state = [], action) {
switch (action.type) {
case FETCH_FAILURE:
console.error('SOMETHING BAD JUST HAPPENED');
break;
case FETCH_SUCCESS:
return Object.assign([], state, action.accountData);
default:
return state;
}
}
或者在这种情况下可以这样做:
export function accountData(state = [], action) {
switch (action.type) {
case FETCH_FAILURE:
console.error('SOMETHING BAD JUST HAPPENED');
break;
case FETCH_SUCCESS:
return action.accountData;
default:
return state;
}
}
是的,您可以替换整个状态。*
对象。assign
是一种简单方便的方法,可以替换部分状态,同时保留所有其他状态,并以不变的方式执行此操作。如果要替换整个状态,则无需使用Object.assign
(*当我说国家时,我指的是减速器负责的国家部分。)
此外,对数组使用Object.assign
也没有意义<代码>对象.assign([],状态,操作.accountData)在语义上等同于Object.assign([],action.accountData)代码>即,它创建数组的新副本。但由于它是一个数组而不是一个对象,因此编写它的更明确、更直观的方法是action.accountData.slice(0)
或[…action.accountData]
。[更正:事实上,Object.assign
为数组上的索引替换进行索引,这几乎肯定不是您想要的。]
只要将数组视为只读,就可以自行返回数组,而无需复制它。最后一种编写方法是返回action.accountData代码>-完全正确
最后,我必须对FETCH\u失败
案例提出异议。你不会为这次行动返回任何东西。但是你的减速机应该总是返回一些东西。而不是break
您可能应该具有返回状态代码>或返回[]代码>具体取决于您希望如何处理故障案例。您所说的“一切正常”是什么意思?如果代码做了您希望它做的事情,那么问题是什么?旁白:您默认的状态是否真的是一个数组?是的,它是一个帐户数组。我经常读到关于不改变状态的文章,如果我只返回帐户而不复制它,我实际上是这样做的。不管是合并旧状态还是整体替换,你都在改变状态。相关,使用对象。使用数组分配,我觉得奇怪吗?你确定这和你认为的一样吗?你对将Object.assign
应用于数组的解释是错误的;它仍然进行浅合并。试试看:Object.assign([],['a','b','c'],['d'])/->['d','b','c']
hey。谢谢。fetch_失败案例返回了一些东西,我只是将其从代码段中删除以保持其更干净;)