在Map到新数组或使用immer后,Redux reducer不会导致重新渲染

sh7euo9m  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(133)

在我的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 
}
hjqgdpho

hjqgdpho1#

找到了。Redux正在正常重新渲染。问题与Redux无关。
这是因为我试图更新的对象是作为react native中的导航参数传递的,并且这不会随状态更改而更新(引用是通过导航传递的对象,而不是Redux状态)。
使用useSelector()解决该问题。

相关问题