标题听起来有线,但如果我从服务器和reducer收集数据会发生什么,我只想返回这些数据并将它们设置为新状态。
E.g。从后端获取数据。如果我想要替换它,我真的需要复制以前的状态:
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;
}
}
答案 0 :(得分:2)
是的,你可以取代整个州。* Object.assign
只是一种方便的方法来替换部分状态,同时保留其他所有状态,并以不可变的方式这样做。如果您要替换整个州,则无需使用Object.assign
。
(*当我说状态我指的是减速器负责的状态部分。)
此外,将Object.assign
用于数组是没有意义的。 [更正:事实上, Object.assign([], state, action.accountData);
在语义上等同于Object.assign([], action.accountData);
也就是说,它创建了一个新的数组副本。但由于它是一个数组而不是一个对象,一个更明确和直观的方式来编写它将是action.accountData.slice(0)
或[...action.accountData]
。Object.assign
对数组进行索引索引替换,这几乎肯定不是你想要的。]
只要您认为数组是只读的,您就可以自行返回数组而不复制它。所以你写的最终方式 - return action.accountData;
- 完全正确。
最后,我必须对FETCH_FAILURE
案件提出异议。你没有为此动作返回任何内容。但是你的reducer应该总是返回某些东西。您应该break;
或return state;
,而不是return [];
,而不是query?.whereKey("entriesCount", lessThan: "entriesLimit")
取决于您想要如何处理失败案例。