我希望用户点击列表中的某个项目并将其添加到他们的收藏夹页面。我遇到的问题是,如果用户点击同一个项目两次,它将被添加到他们的收藏夹页面两次,并产生问题,因为两个孩子拥有相同的密钥。
我在 Reducer 中用这种方式更新状态:
const initialState = {
selectedFavorites: [],
};
addFavorite: (state, action) => {
return {
...state,
selectedFavorites: [...state.selectedFavorites, action.payload],
};
},
当用户点击要添加到收藏夹的项目时:
const handlePress = () => {
favorite === true ? setFavorite(false) : setFavorite(true);
dispatch(
addFavorite({
id: currentIndex,
title: getIds[currentIndex].title,
liked: 'true',
}),
);
setTimeout(() => {
setFavorite(false);
}, 500);
};
我尝试过new Set()
但无法使其工作。有什么好方法可以复制和呈现状态而不产生任何重复值?
我不会在减速器中修复此问题,而是在 之前修复它
dispatch
,例如,检查它是否已经是最喜欢的。假设
ids
包含所有收藏索引的列表,用于includes
检查该 ID 是否已存在于数组中在
addFavorite
Reducer 函数中检查selectedFavorites
数组是否已经包含具有匹配 id 值的元素,如果是,则仅添加新的收藏夹。例子:
或者,您似乎可以在处理程序中修复此问题,因为您似乎还保留并维护了本地
favorite
状态。例子:
如果您想要的只是过滤列表中的不同值,则此解决方案由@TLindig 编写。
但您也可以在调用调度之前检查该项目是否已被收藏: