You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Material UI中setState数组filter删除元素失效问题咨询

问题分析与修复方案

原删除函数失效原因

DOM元素的id属性值是字符串类型,但你在filter里用index !== deletedId做严格比较时,index是数字类型,数字和字符串永远不相等,导致过滤后的数组和原数组完全一致,状态根本没更新。

修改后报错的原因

你修改后的deleteItem函数中,setListOfDocs的回调函数没有返回过滤后的数组,最终listOfDocs被设置为undefined,后续执行listOfDocs.map时自然会抛出Cannot read properties of undefined (reading 'map')的错误。

正确实现方式

写法1:类型转换+函数式更新

把DOM的id转为数字,同时用函数式更新确保拿到最新状态:

const deleteItem = ({ currentTarget }) => {
  const deletedIndex = Number(currentTarget.id);
  setListOfDocs(prev => prev.filter((_, index) => index !== deletedIndex));
};

写法2:直接传递索引(更简洁规范)

无需依赖DOM的id,直接在map时把索引传给删除函数,还能避免多个元素id重复的HTML规范问题:

// 先修改删除函数,直接接收索引参数
const deleteItem = (targetIndex) => {
  setListOfDocs(prev => prev.filter((_, index) => index !== targetIndex));
};

// 然后在JSX的map调用时传入索引
{listOfDocs.map((item, index) => {
  return (
    <ListItem secondaryAction={<Checkbox />}>
      <ListItemAvatar>
        <Avatar>
          <DeleteIcon onClick={() => deleteItem(index)} />
        </Avatar>
      </ListItemAvatar>
      <ListItemButton>
        <ListItemText primary={item} />
      </ListItemButton>
    </ListItem>
  );
})}

另外提个小细节:原handleEnter里先setTextInputValue(target.value)又立刻setTextInputValue(null)是冗余操作,添加完项后直接设置为null即可。

内容的提问来源于stack exchange,提问作者chu8

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:40:53