使用 Redux 替换 reducer 中的整个状态
Replacing the whole state within a reducer usint Redux
标题听起来有线,但是如果我从服务器和减速器中收集数据会发生什么,我只想return这些数据并将它们设置为新状态。
例如从后端获取数据。如果我想像这样替换它,我真的需要复制以前的状态吗:
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;
}
}
是的,您可以替换整个状态。* Object.assign
只是一种方便的方法,可以替换部分状态,同时保留所有其他状态,并且以不可变的方式进行。如果您要替换整个状态,则无需使用 Object.assign
.
(*当我说状态时,我指的是减速器负责的状态部分。)
此外,对数组使用 Object.assign
是没有意义的。 Object.assign([], state, action.accountData);
在语义上等同于 Object.assign([], action.accountData);
即,它创建数组的新副本。但是因为它是一个数组而不是一个对象,所以更明确和直观的写法是 action.accountData.slice(0)
或 [...action.accountData]
. [CORRECTION: 事实上,Object.assign
对数组进行 index-for-index 替换,这几乎肯定不是你想要的。]
只要你把数组当成read-only,你就可以return这个数组本身而不用复制它。所以你写的最后一种方式 - return action.accountData;
- 是完全正确的。
最后,我必须对 FETCH_FAILURE
案提出异议。您不会return为此操作做任何事情。但是你的 reducer 应该总是 return something。您可能应该使用 return state;
或 return [];
而不是 break;
,具体取决于您要如何处理失败案例。
标题听起来有线,但是如果我从服务器和减速器中收集数据会发生什么,我只想return这些数据并将它们设置为新状态。
例如从后端获取数据。如果我想像这样替换它,我真的需要复制以前的状态吗:
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;
}
}
是的,您可以替换整个状态。* Object.assign
只是一种方便的方法,可以替换部分状态,同时保留所有其他状态,并且以不可变的方式进行。如果您要替换整个状态,则无需使用 Object.assign
.
(*当我说状态时,我指的是减速器负责的状态部分。)
此外,对数组使用 Object.assign
是没有意义的。 [CORRECTION: 事实上,Object.assign([], state, action.accountData);
在语义上等同于 Object.assign([], action.accountData);
即,它创建数组的新副本。但是因为它是一个数组而不是一个对象,所以更明确和直观的写法是 action.accountData.slice(0)
或 [...action.accountData]
.Object.assign
对数组进行 index-for-index 替换,这几乎肯定不是你想要的。]
只要你把数组当成read-only,你就可以return这个数组本身而不用复制它。所以你写的最后一种方式 - return action.accountData;
- 是完全正确的。
最后,我必须对 FETCH_FAILURE
案提出异议。您不会return为此操作做任何事情。但是你的 reducer 应该总是 return something。您可能应该使用 return state;
或 return [];
而不是 break;
,具体取决于您要如何处理失败案例。