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

React点击按钮捕获name属性报错this undefined问题求助

React按钮点击捕获name属性问题修复

核心问题分析

你遇到的this is undefined报错,根源在于:

  1. logName是普通函数,直接调用时,在React严格模式下this默认指向undefined,而非按钮元素,所以this.name自然取不到值。
  2. 你虽然在onClick里给logName传递了event.currentTarget.getAttribute("name")参数,但logName函数根本没接收这个参数,依然在访问this.name,相当于白传了。

另外你尝试的event.currentTarget.name其实是有效的,只是因为没正确传递给logName才没生效。

几种修复方案

方案一:让logName接收参数,传递事件对象中的name值

直接修改logName函数,让它接收参数并打印,同时在onClick中传递正确的name值:

export function TestButton(props){
    function logName(name) {
        console.log(name)
    }
    return(
        <button name={props.name} onClick={event => logName(event.currentTarget.name)} type='button'>{props.text}</button>
    )
}

这里event.currentTarget.name可以直接拿到按钮的name属性值,比getAttribute("name")更简洁。

方案二:直接使用组件props中的name(推荐)

既然name已经作为props传入组件,完全没必要从DOM元素中获取,直接用props.name更符合React的数据流理念,代码也更简洁:

export function TestButton(props){
    function logName() {
        console.log(props.name)
    }
    return(
        <button name={props.name} onClick={logName} type='button'>{props.text}</button>
    )
}

这种方式避免了操作DOM,性能更好,逻辑也更清晰。

方案三:修正this指向(不推荐,没必要)

如果一定要让this指向按钮元素,可以通过useRef实现,但步骤繁琐,不如前两种方案直接:

import { useRef } from 'react';

export function TestButton(props){
    const buttonRef = useRef(null);
    
    function logName() {
        console.log(buttonRef.current.name)
    }
    
    return(
        <button ref={buttonRef} name={props.name} onClick={logName} type='button'>{props.text}</button>
    )
}

这种方式需要获取DOM元素,适合特殊场景,但这里完全没必要。

总结

你忽略了两个关键点:普通函数直接调用时的this指向问题,以及参数传递和接收的匹配。优先选择方案二,直接使用props中的值,是最符合React开发习惯的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:25:49