用 e.currentTarget 替代 e.target 可稳定获取按钮元素及其自定义属性;因 SVG 图标由嵌套的 <path> 组成,e.target 常指向无 value 的 <path>,而 e.currentTarget 始终指向绑定事件的 <button>。
直接用 e.currenttarget 替代 e.target,就能绕开“点到 path 就拿不到按钮值”的死结。
为什么 target 会跑到 path 上?
SVG 图标(比如 react-icons 渲染的)本质是一组嵌套元素:<svg> 包着 <path>。用户点击图标时,事件真实触发点是最内层的可渲染图形节点——通常是 <path>,而不是你绑事件的 <button>。而 <path> 没有 value 属性,e.target.value 必然为 undefined。
currentTarget 才是你真正要的“监听器所在元素”
e.currentTarget 始终指向事件监听器绑定的那个元素,不受点击位置影响。只要你在 <button> 上写了 onClick,那无论点的是按钮文字、空白处还是 SVG 内部的 path,e.currentTarget 都稳定是那个 <button> 元素。
- 获取按钮上的自定义值:e.currentTarget.value 或 e.currentTarget.dataset.id
- 读取 class 名:e.currentTarget.className
- 触发父组件方法时,传参更可靠,不用再向上遍历 parentNode
顺手加固:避免意外事件穿透
如果 SVG 图标本身也带点击行为(比如同时支持图标和按钮区域响应),可能引发重复触发或逻辑冲突。可在 <svg> 或 <path> 上加:
- pointer-events: none(CSS)——让图标图形不拦截鼠标事件,所有点击都透传给 button
- 或在 handleRemove 开头加 if (e.target !== e.currentTarget) return;,主动过滤掉子元素触发的冒泡事件
别再依赖 event.target.value 传数据
value 属性在 <button> 上虽可用,但语义不严谨(HTML 规范中 button 的 value 主要用于表单提交)。更推荐用 data 属性:
- 写法:<button data-cid={data.cId}></button>
- 读取:e.currentTarget.dataset.cid
- 优势:无歧义、支持任意字符串、React 中不会被自动转换类型


















