【问题标题】:Passing in a value through the onClick method to parent component but its undefined通过 onClick 方法将值传递给父组件但其未定义
【发布时间】:2021-07-03 05:09:10
【问题描述】:

我是 React 新手,如果这是一个简单/愚蠢的问题,我深表歉意。我正在尝试使用 React 创建一个简单的计算器应用程序,并且我正在尝试简单地打印我单击的按钮的值。我有一个可以渲染所有按钮的小键盘组件,但现在我只有一个。

const Keypad = () => {
    return (
        <div className="Keypad">
            <button name='1' onClick={e => this.onClick(e.name)}>1</button>
            
        </div>
    )
}

export default Keypad

在我的主应用程序文件中,我有一个 onClick 方法,它将检查按下的按钮的值并打印它,当我调用键盘组件时,我也会调用 onClick:

const onClick = (e) => {
    if (e.name === "1") {
      console.log(e.name)
    } else {
      console.log("nope")
    }
  };

return (
    <div className="Header">
      <header>
        <h1>Calculator</h1>
      </header>
      <Result />
      <Keypad onClick={onClick}/>
    </div>
  );

它编译成功,但是当我尝试单击按钮时,我收到“TypeError: Cannot read property 'onClick' of undefined”错误。我已经按照不同网站的一些步骤进行操作,但对为什么这不起作用感到困惑..

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您使用了函数式组件,因此this 关键字是多余的。

    const Keypad = ({onClick}) => {
        return (
            <div className="Keypad">
                <button name='1' onClick={onClick}>1</button>
                
            </div>
        )
    }
    
    export default Keypad
    

    然后将e.name 传递给Keypad 组件中的onClick 函数。

    const onClick = (e) => {
        if (e.target.name === "1") {
          console.log(e.target.name)
        } else {
          console.log("nope")
        }
      };
    
    return (
        <div className="Header">
          <header>
            <h1>Calculator</h1>
          </header>
          <Result />
          <Keypad onClick={onClick}/>
        </div>
      );
    

    【讨论】:

    • 谢谢。如果使用功能组件,我不知道不需要“this”关键字:)。如果我可能会问,我想使用 Result 组件在屏幕上打印值,如下所示:const Result = (props) =&gt; { return ( &lt;div className="Result"&gt; &lt;p&gt;{props.result}&lt;/p&gt; &lt;/div&gt; ) } 如果我在 onClick 中传递&lt;Result result={e.target.name} /&gt;,它不应该工作吗?
    • @lagoon__themoon 不,e 不在组件的范围内,您无法从回调中返回和呈现 JSX。您必须将其保存到状态中并作为道具传递给Result
    【解决方案2】:

    Keypad 组件没有定义 this 也没有定义 onClick 回调,它是作为 prop 从父级传递的。

    const Keypad = ({ onClick }) => {
      return (
        <div className="Keypad">
          <button name='1' onClick={onClick}>1</button>
        </div>
      )
    }
    

    事件e,应该是e.target.name

    const onClick = (e) => {
      if (e.target.name === "1") {
        console.log(e.target.name)
      } else {
        console.log("nope")
      }
    };
    
    return (
      <div className="Header">
        <header>
          <h1>Calculator</h1>
        </header>
        <Result />
        <Keypad onClick={onClick}/>
      </div>
    );
    

    【讨论】:

    • 我没有意识到我必须将 onClick 作为道具传递给 Keypad,如果使用功能组件,则不需要“this”。我有很多东西要学..
    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2017-10-19
    • 2015-06-30
    相关资源
    最近更新 更多