当前位置: 首页 > 知识库问答 >
问题:

如何在React上正确绑定onhtml处理程序到this

锺离高丽
2023-03-14

解释为什么这不是一个重复:我的代码已经在工作了,我已经作为一个注释包括在内。问题是,当我将它包含到click handler函数中时,这个上下文为什么会发生变化。
我正在尝试在React中创建一个计算器项目。目标是将onclick处理程序附加到数字按钮,以便在计算器显示区域显示数字。但是,如果直接将处理程序写入render方法,则该处理程序正在工作,如果尝试使用ComponentDidMount,则会出现错误this.inputDigit不是函数。如何正确绑定此.inputDigit(数字)?

import React from 'react';
import './App.css';

export default class Calculator extends React.Component {

// display of calculator initially zero
state = {
  displayValue: '0'
}

//click handler function
inputDigit(digit){
  const { displayValue } = this.state;
  this.setState({
    displayValue: displayValue+String(digit)
  })
}

componentDidMount(){

  //Get all number keys and attach click handler function
  var numberKeys = document.getElementsByClassName("number-keys");
  var myFunction = function() {
    var targetNumber = Number(this.innerHTML);
    return this.inputDigit(targetNumber); // This is not working
  };
  for (var i = 0; i < numberKeys.length; i++) {
    numberKeys[i].onclick = myFunction;
  }

}

render() {
  const { displayValue } = this.state;
  return (
    <div className="calculator">
      <div className="calculator-display">{displayValue}</div>
      <div className="calculator-keypad">
        <div className="input-keys">

          <div className="digit-keys">
            {/*<button className="number-keys" onClick={()=> this.inputDigit(0)}>0</button> This will Work*/}}
            <button className="number-keys">0</button>                
            <button className="number-keys1">1</button>
            <button className="number-keys">2</button>
            <button className="number-keys">3</button>
            <button className="number-keys">4</button>
            <button className="number-keys">5</button>
            <button className="number-keys">6</button>
            <button className="number-keys">7</button>
            <button className="number-keys">8</button>
            <button className="number-keys">9</button>
          </div>
        </div>          
      </div>
    </div>
  )
 }
}

共有2个答案

司知
2023-03-14

在构造函数中绑定它

constructor(props) {
    super(props);
    this.inputDigit = this.inputDigit.bind(this);
}
琴俊良
2023-03-14

这是因为你把它写在一个没有绑定的函数里,

使用

var myFunction = function() {
    var targetNumber = Number(this.innerHTML);
    return this.inputDigit(targetNumber); 
  }.bind(this);

或者

const myFunction = () => {
    var targetNumber = Number(this.innerHTML);
    return this.inputDigit(targetNumber); 
}

在此之后,您需要绑定inputDigit函数,因为它也使用setState

//click handler function
inputDigit = (digit) => {
  const { displayValue } = this.state;
  this.setState({
    displayValue: displayValue+String(digit)
  })
}

由于您也希望使用按钮文本,因此在这种情况下,您应该使用一个单独的变量代替this来调用inputDigit函数,如

class Calculator extends React.Component {

// display of calculator initially zero
state = {
  displayValue: '0'
}

//click handler function
inputDigit(digit){
  const { displayValue } = this.state;
  this.setState({
    displayValue: displayValue+String(digit)
  })
}

componentDidMount(){

  //Get all number keys and attach click handler function
  var numberKeys = document.getElementsByClassName("number-keys");
  var that = this;
  var myFunction = function() {
    var targetNumber = Number(this.innerHTML);
    console.log(targetNumber);
    return that.inputDigit(targetNumber); // This is not working
  };
  for (var i = 0; i < numberKeys.length; i++) {
    numberKeys[i].onclick = myFunction;
  }

}

render() {
  const { displayValue } = this.state;
  return (
    <div className="calculator">
      <div className="calculator-display">{displayValue}</div>
      <div className="calculator-keypad">
        <div className="input-keys">

          <div className="digit-keys">
            {/*<button className="number-keys" onClick={()=> this.inputDigit(0)}>0</button> This will Work*/}
            <button className="number-keys">0</button>                
            <button className="number-keys">1</button>
            <button className="number-keys">2</button>
            <button className="number-keys">3</button>
            <button className="number-keys">4</button>
            <button className="number-keys">5</button>
            <button className="number-keys">6</button>
            <button className="number-keys">7</button>
            <button className="number-keys">8</button>
            <button className="number-keys">9</button>
          </div>
        </div>          
      </div>
    </div>
  )
 }
} 

ReactDOM.render(<Calculator/>, document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
 类似资料:
  • 问题内容: 解释为什么这不是重复的:我的代码已经在工作,我已作为注释包含在内。问题是为什么将上下文包含在单击处理程序函数中时上下文会发生变化。 我正在React中尝试一个计算器项目。目的是将onclick处理程序附加到数字按钮,以便数字显示在计算器显示区域上。如果将处理程序直接编写为render方法,则它可以正常工作,但是,如果我尝试从ComponentDidMount尝试,则会收到错误消息。如何

  • 问题内容: 当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此它没有充分的理由使缓存无效,并且使我的跟踪活动混乱。 您知道如何将线程绑定到处理器,为什么系统会这样做? 问题答案: 使用(这是特定于Linux的)。 为什么调度程序会在不同处理器之间切换线程?好吧,假设您的线程最后一次在处理器1上运行,并且当前正在等待再次安排执行时

  • 问题内容: 我在掌握如何正确处理从以多线程方式使用Boost Asio的多线程程序创建子进程方面遇到一些麻烦。 如果我理解正确,那么在Unix世界中启动子进程的方法是先调用,然后调用。另外,如果我理解正确,则调用将复制所有文件描述符,依此类推,除非标记为,否则需要 在子进程中将其 关闭(从而在调用时被原子关闭)。 Boost Asio需要在被调用时得到通知,以便通过调用正确运行。但是,在多线程程序

  • 在我的环境中,我有JSF 2.2 CDI Spring 4 Wildfly 9 Spring Data在野生服务器中,我配置了两个数据源: 示例(来自工厂) OracleDS(我创建的这个) 在persitence.xml,我有: 我的applicationContext.xml: http://www . spring framework . org/schema/beans/spring-be

  • 我正在使用Xamarin和MVVMCross开发一个应用程序,在创建绑定NSLayoutConstraints常量时遇到问题。 我有一个带有子视图的视图,如果某个列表 为此,我向该视图添加了一个NSLayoutConstraint,以便能够以编程方式修改其高度,并使用以下代码行对其进行绑定: CountToConstraintHeightConverter非常简单,它只检查值是否等于0以返回0或默

  • 问题内容: Java的I / O类,,,和他们的不同子类中都有一个可抛出的方法。 对于处理此类异常的正确方法是否存在共识? 我经常看到建议,只是默默地忽略它们,但这是错误的,至少在打开用于写的资源的情况下,关闭文件时出现问题可能意味着无法写入/发送未刷新的数据。 另一方面,在阅读资源时,我还不清楚为什么会抛出异常以及如何处理。 那么有什么标准建议吗? 问题答案: 记录下来。 您实际上不能 做任何事