在我的redux reducer中,我Map状态并复制内部项,然后返回列表,该列表应该是一个新的引用,因此reducer应该在更改时导致重新渲染,但它没有。
下面的代码不会导致重新渲染。
const initialState: Group[] = [];
export default function activeGroups(state = initialState, action: AnyAction) {
switch (action.type) {
case 'groups/createPod/fulfilled': {
// append the new pod into the active group that matches the groupId
const { pod, groupId } = action.payload;
const newState = state.map((group) => { // Map to new list
if (group.id === groupId) {
return {
...group, // Not mutating original state, copying the state into new list
pods: [pod, ...group.pods],
};
}
return group;
});
return newState; // This does not cause a re-render, why?
}
我从immer
尝试了produce
case 'groups/createPod/fulfilled': {
// append the new pod into the active group that matches the groupId
const nextState = produce(state, (draft) => {
const group = draft.find((e) => e.id === action.payload.groupId);
if (group) {
group.pods.unshift(action.payload.pod);
}
});
return JSON.parse(JSON.stringify(nextState)); // Even tried this
}
1条答案
按热度按时间hjqgdpho1#
找到了。Redux正在正常重新渲染。问题与Redux无关。
这是因为我试图更新的对象是作为react native中的导航参数传递的,并且这不会随状态更改而更新(引用是通过导航传递的对象,而不是Redux状态)。
使用
useSelector()
解决该问题。