解释为什么这不是重复的:我的代码已经在工作,我已作为注释包含在内。问题是为什么将this
上下文包含在单击处理程序函数中时上下文会发生变化。
我正在React中尝试一个计算器项目。目的是将onclick处理程序附加到数字按钮,以便数字显示在计算器显示区域上。如果将处理程序直接编写为render方法,则它可以正常工作,但是,如果我尝试从ComponentDidMount尝试,则会收到错误消息this.inputDigit is not a function
。如何this.inputDigit(digit)
正确绑定?
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>
)
}
}
那是因为您是在未绑定的函数中编写它,
用
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>
解释为什么这不是一个重复:我的代码已经在工作了,我已经作为一个注释包括在内。问题是,当我将它包含到click handler函数中时,上下文为什么会发生变化。 我正在尝试在React中创建一个计算器项目。目标是将onclick处理程序附加到数字按钮,以便在计算器显示区域显示数字。但是,如果直接将处理程序写入render方法,则该处理程序正在工作,如果尝试使用ComponentDidMount,则会
问题内容: 当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此它没有充分的理由使缓存无效,并且使我的跟踪活动混乱。 您知道如何将线程绑定到处理器,为什么系统会这样做? 问题答案: 使用(这是特定于Linux的)。 为什么调度程序会在不同处理器之间切换线程?好吧,假设您的线程最后一次在处理器1上运行,并且当前正在等待再次安排执行时
我读了一大堆关于
问题内容: 我是一位经验丰富的Java程序员,但是大约十年来第一次接触JavaScript / HTML5。我完全困惑于应该是有史以来最简单的事情。 作为示例,我只想绘制一些东西并为其添加事件处理程序。我确定我在做一些愚蠢的事情,但是我搜索了所有内容,没有任何建议(例如,此问题的答案: 添加onclick属性以使用JavaScript输入。我正在使用Firefox10.0.1。我的代码如下。您会看
问题内容: 我是新来的反应者,所以我对此并不了解。我正在尝试向li添加点击处理程序,但该函数似乎未定义? 我想知道是否是因为我的范围设定错误? 问题答案: 设置为,因为在回调函数中是指全局范围(在浏览器中是,或者使用)