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

React Todo列表点击删除功能异常:点击后应用消失求助

React Todo列表删除功能导致应用消失的原因及解决方法

问题重现

点击Todo笔记后,笔记列表(应用核心部分)消失,原删除逻辑无法正确匹配要删除的项。

核心问题

你的Note组件中,删除逻辑依赖从event.target获取id,这会导致两个关键问题:

  • 类型不匹配:DOM元素的id是字符串类型,而你的note.id是数字类型。使用!==严格比较时,数字和字符串永远不相等,filter无法匹配到要删除的项,极端场景下可能意外清空整个列表。
  • target不可靠:如果h1内部有子元素,点击子元素时event.target会指向子元素,无法拿到正确的笔记id。

解决步骤

1. 修改Note组件的删除逻辑

直接使用props传入的note.id,无需从事件对象中获取:

function Note({ notes, note, onClickSetter }) {
    const { input, id } = note
    const [strikeThrough, setStrikeThrough] = useState(false);

    function onNoteClick() {
        // 直接使用note的id进行过滤
        onClickSetter(prev => prev.filter(aNote => aNote.id !== id))
    }

    return (
        <>
            <h1 style={ strikeThrough ? {textDecoration: 'line-through'} : { textDecoration: 'none' }} id={id} onClick={onNoteClick}>{input}</h1>
        </>
    )
}

2. 优化NewNote组件的ID生成逻辑(可选)

原代码用try catch处理空数组的方式不够直观,改为直接判断数组长度:

function onButtonClick(event) {
    onClickSetter((prev) => {
        // 直接判断数组是否为空,生成新ID
        const newId = prev.length === 0 ? 0 : prev[prev.length - 1].id + 1;
        return [...prev, { input: input, id: newId }];
    });
    setInput('');
}

原理说明

  • React中,组件props传递的数据是可靠的,直接使用note.id能确保拿到正确的数字类型ID,和列表中项的id类型一致,filter可以准确匹配并删除目标项。
  • 避免从事件对象中获取业务数据,能减少DOM相关的意外问题,让逻辑更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 18:27:22