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

React待办应用删除项提交新项后复现问题求助

React待办事项删除后新增项时已删项重现的问题修复

核心问题分析

  • 父子组件状态不同步+删除逻辑参数错误:Items组件删除后向父组件传递的是整个删除后的数组,但父组件的删除处理函数期望接收单个被删除项的id,导致父组件的数组过滤逻辑完全失效——delData.id为undefined,过滤后返回原数组,父组件的数据源根本没更新,新增待办时自然会带上旧数据。
  • 用数组index作为key的风险:删除项后数组索引重排,React会复用旧组件实例,可能引发UI渲染异常。

具体修复步骤

1. 修正删除逻辑的参数传递

修改Items组件的deleteHandler,向父组件传递被删除的具体项,而非整个数组:

// Items.js - deleteHandler 改造
const deleteHandler = (val) => {
  const deletedItem = listData[val]; // 获取被删除的项
  deletedDataToPr(deletedItem); // 传递单个项给父组件
  setSelected(null);
};

2. 修正父组件的过滤逻辑

确保父组件能正确接收被删除项并过滤数组:

// App.js - dataAftrDelInPar 改造
const dataAftrDelInPar = (deletedItem) => {
  const updatedFormData = formData.filter((item) => item.id !== deletedItem.id);
  setInitFormData(updatedFormData);
};

3. 移除Items组件的冗余状态,保持单一数据源

Items组件不需要维护自己的frmValue状态,直接用父组件传递的listData,彻底避免状态不同步:

// Items.js 移除以下冗余代码:
const [frmValue, setFrmVal] = useState(listData);
useEffect(() => {
  setFrmVal(listData);
}, [listData]);

// 所有用到frmValue的地方替换为listData,同时修改编辑逻辑:
// 先给Items组件新增更新数据的回调props
// App.js里的Items组件:
<Items 
  listData={formData} 
  deletedDataToPr={dataAftrDelInPar}
  updateDataToPr={(updatedList) => setInitFormData(updatedList)}
/>

// Items.js的editFrmSave改造:
const editFrmSave = (saveFrmVal) => {
  const updatedData = [...listData];
  updatedData[saveFrmVal] = updatedFrmRef.current.value;
  updateDataToPr(updatedData); // 通知父组件更新数据源
  setUpdateInp(null);
};

4. 使用唯一id作为列表项的key

替换index为待办项的id作为React元素的key,避免索引重排导致的UI异常:

// Items.js 列表渲染部分改造
{listData.map((currEl, index) => (
  <div
    className="justify-between flex items-center rounded-md bg-blue-50 my-3 px-2 py-2 ring-1 ring-inset ring-blue-700/10"
    key={currEl.id} // 用item的唯一id作为key
  >
    {/* 其余内容不变 */}
  </div>
))}

额外说明

尽量让父组件维护唯一的数据源,子组件只负责渲染和触发状态变更的回调,这样所有操作(新增、删除、编辑)都会基于最新的状态执行,彻底避免状态不同步问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:56:08