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

React中如何在点击事件函数内获取被点击按钮的ref值

原因说明

e.target.ref 无法生效是React的特性导致的:ref是React的特殊保留属性,不会被挂载到原生DOM节点上,因此原生事件对象的target属性上根本不存在ref字段,自然读不到你绑定的ref值。

可落地方案

根据你的场景选任意一种即可:

  • 优先选:自定义data属性标记,实现最简单无额外依赖
    不需要依赖ref做匹配,直接给按钮加自定义data-*属性存对应的ref标识,事件触发时直接从DOM的dataset里读值即可,兼容性最好:

    // 按钮定义
    <button ref={btnRef1} data-ref-name="btnRef1" onClick={loader}></button>
    <button ref={btnRef2} data-ref-name="btnRef2" onClick={loader}></button>
    
    // 事件处理逻辑
    const loader = (e) => {
      console.log(e.target.dataset.refName);
      // 点击第一个按钮直接输出 "btnRef1",完全符合你的预期
    };
    
  • 必须匹配ref实体时:直接做DOM节点比对
    如果你需要拿到的不是字符串标识,而是ref对象本身,可以利用ref.current存储的就是对应原生DOM的特性,拿事件触发的target节点和各个ref的current值做全等匹配即可:

    // 提前用useRef/createRef声明好两个ref
    const btnRef1 = useRef(null);
    const btnRef2 = useRef(null);
    
    const loader = (e) => {
      const clickedDom = e.target;
      if (clickedDom === btnRef1.current) console.log("btnRef1");
      if (clickedDom === btnRef2.current) console.log("btnRef2");
    };
    

    如果按钮数量多,可以把所有ref存在一个键值对映射表里,遍历匹配就行,不用写大量条件判断。

  • 逻辑最直观:绑定事件时直接传参
    不需要在事件触发后反向查找,绑定onClick的时候直接把对应的ref标识当参数传入处理函数即可:

    // 按钮定义
    <button ref={btnRef1} onClick={() => loader("btnRef1")}></button>
    <button ref={btnRef2} onClick={() => loader("btnRef2")}></button>
    
    // 处理函数
    const loader = (refFlag) => {
      console.log(refFlag); // 直接拿到传入的标识
    };
    

注意:不要使用给ref赋值字符串的旧写法,这种写法在React新版本里已经被废弃,会有性能和兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:30:35