设置状态内的数组的过滤数组函数不起作用
2022-11-28
78
尝试获取 onclick 函数以从数组中删除项目(已被单击)。
但是,它不会删除任何内容。setListOfDocs 应该设置 listOfDocs 数组,其中单击的项目已消失(onClick 函数是一个过滤器)
它不起作用。控制台中没有错误。我不知道为什么它没有更新状态,以便 listOfDocs 是新的过滤数组(单击的项目已从数组中删除)。
我正在使用材料用户界面。
function NewMatterDocuments() {
const [listOfDocs, setListOfDocs] = useState(['item1', 'item2', 'item3', 'item4']);
const [disableButton, toggleDisableButton] = useState(false);
const [displayTextField, toggleDisplayTextField] = useState('none');
const [textInputValue, setTextInputValue] = useState();
const buttonClick = () => {
toggleDisableButton(true);
toggleDisplayTextField('box');
};
//this function works
const handleEnter = ({ target }) => {
setTextInputValue(target.value);
const newItem = target.value;
setListOfDocs((prev) => {
return [...prev, newItem];
});
setTextInputValue(null);
}; //
//this function does not work....which is weird because it pretty much
// does the same thing as the previous function except it deletes an item
// instead of adding it to the array. Why does the previous function work
// but this one doesnt?
const deleteItem = ({ currentTarget }) => {
const deletedId = currentTarget.id;
const result = listOfDocs.filter((item, index) => index !== deletedId);
setListOfDocs(result)
};
return (
<div>
<Typography variant="body2">
<FormGroup>
<Grid container spacing={3}>
<Grid item xs={6}>
<Grid item xs={6}>
Document Type
</Grid>
{listOfDocs.map((item, index) => {
return (
<ListItem id={index} secondaryAction={<Checkbox />}>
<ListItemAvatar>
<Avatar>
<DeleteIcon id={index} onClick={deleteItem} />
</Avatar>
</ListItemAvatar>
<ListItemButton>
<ListItemText id={index} primary={item} />
</ListItemButton>
</ListItem>
);
})}
<List sx={{ width: '100%', bgcolor: 'background.paper' }}>
<Button disabled={!disableButton ? false : true} color="inherit" onClick={buttonClick}>
Add
</Button>
<ListItem sx={{ display: `${displayTextField}` }} id={uuid()} key={uuid()}>
<TextField
id="standard-basic"
label="Additional Document"
variant="standard"
value={textInputValue}
onKeyDown={(e) => {
e.key === 'Enter' && handleEnter(e);
}}
></TextField>
</ListItem>
</List>
</Grid>
</Grid>
</FormGroup>
</Typography>
</div>
);
}
export default NewMatterDocuments;
我试图将不起作用的函数更改为以下内容:
const deleteItem = ({ currentTarget }) => {
setListOfDocs((prev) => {
prev.filter((item, index) => index != currentTarget.id);
});
};
它给出错误 “未捕获的类型错误:无法读取未定义的属性(读取'map')” jsx 中的下一个 map 函数不起作用...
2个回答
您应该在过滤后返回数据:
const deleteItem = ({ currentTarget }) => {
setListOfDocs((prev) => {
return prev.filter((item, index) => index != currentTarget.id);
});
};
更新:
您的第一次尝试存在问题。 currentTarget.id 字段是字符串,但在您的过滤方法中,您正在使用 !== 将其与索引(数字)进行比较,这也会检查 2 个变量的类型。
因此,您可以通过将 !== 替换为 != 或将字符串转换为数字来修复它。
Amirhossein
2022-11-29
我认为您在过滤功能中犯了一个小错误:您正在将项目 index 与 deletedId 进行比较,而您应该将 item 与 deletedId 进行比较
这应该是正确的:
const deleteItem = ({ currentTarget }) => {
const deletedId = currentTarget.id;
const result = listOfDocs.filter((item, index) => item !== deletedId);
setListOfDocs(result)
};
Jérémy Rippert
2022-11-28