reactjs React:Reducer函数后状态变为未定义

pcww981p  于 2023-04-20  发布在  React
关注(0)|答案(1)|浏览(116)

我有一个复杂的嵌套对象,我必须对它做一些修改。所以我决定使用useReducer钩子。我创建了reducer函数,每当我试图在嵌套对象中追加一个数组时,它都会使整个状态未定义。
我试着注销数据,发现由于严格模式,它运行了两次。它可以用两个附加值而不是一个值注销状态值,但它立即更改为undefined。
下面是我的代码:
创建.js

const [sections, sectionsDispatch] = useReducer(
  sectionsReducer,
  defaultSections
);
  • sectionsReducer.js * 错误发生在new_data的情况下
export default function sectionsReducer(state, action) {
  switch (action.type) {
    case "swap_sections": {
      return swap_sections(
        state,
        action.data.startIndex,
        action.data.destinationIndex
      );
    }
    case "new_data": {
      return new_data(state, action.data.currentSectionId, action.data.newData);
    }
    case "swap_data": {
      return swap_data(
        state,
        action.data.currentSectionId,
        action.data.startIndex,
        action.data.destinationIndex
      );
    }

    default:
      break;
  }
}

function new_data(state, currentSectionId, newData) {
  const keys = findById(state, currentSectionId).data.map((data) => data.id);
  const id = keys.length > 0 ? Math.max(...keys) + 1 : 1;
  let newSections = [...state];
  const currentNewSection = findById(newSections, currentSectionId);
  currentNewSection.data = [
    ...currentNewSection.data, newData(id)];
  return newSections;
}
  • 其他.js*
sectionsDispatch({
   type: "new_data",
   data: {
     currentSectionId: currentSectionId,
     newData: (id) => {
       return {
         id: id,
         data: new EducationModel(),
         deleted: false,
         index: id,
       };
     },
   },
 });

我使用了useEffect钩子来注销sections状态。它首先注销了状态,并添加了两个值。注销后立即注销undefined。
我也尝试过不使用严格模式,也产生了同样的错误。我还尝试删除new_data函数的append部分,因此得到了以下代码:

const keys = findById(state, currentSectionId).data.map((data) => data.id);
  const id = keys.length > 0 ? Math.max(...keys) + 1 : 1;
  let newSections = [...state];
  const currentNewSection = findById(newSections, currentSectionId);
  currentNewSection.data = [...currentNewSection.data];
  return newSections;
}

它没有任何错误,但它也没有按预期追加数组。所以我认为我的问题是在这里的某个地方。谢谢你的帮助!

bihw5rsg

bihw5rsg1#

您的new_data函数返回newSections,但看起来您希望它返回currentNewSection
另外,您正在使用findById函数并将状态传递给它,但在下面几行中,您使用了带有状态副本的同一个函数。这让我怀疑findById是否正在改变该变量。如果是这样,您应该更快地制作该副本,并将其用于对findById的两次调用,而不是直接传递状态。
希望这有帮助!

相关问题