我有一个复杂的嵌套对象,我必须对它做一些修改。所以我决定使用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;
}
它没有任何错误,但它也没有按预期追加数组。所以我认为我的问题是在这里的某个地方。谢谢你的帮助!
1条答案
按热度按时间bihw5rsg1#
您的
new_data
函数返回newSections
,但看起来您希望它返回currentNewSection
。另外,您正在使用
findById
函数并将状态传递给它,但在下面几行中,您使用了带有状态副本的同一个函数。这让我怀疑findById
是否正在改变该变量。如果是这样,您应该更快地制作该副本,并将其用于对findById
的两次调用,而不是直接传递状态。希望这有帮助!