我最近开始反应,我正尝试创建一个计算器作为自己的学习练习。
目的是每当我单击数字按钮时,该值就会出现在输入组件中。到目前为止,我已经做到这一点了,但该值仅在第二个onClick事件上更改。
当前,val1 Prop 在第一次单击时从输入中消失,然后在第二次单击时以先前的按钮值重新出现。
我的代码结构上的任何提示都将受到欢迎,并且在构建计算器时提供的任何指导也将非常有用。我对此还很陌生。
这是我的代码如下:
app.js
import React, {Component} from 'react';
import InputField from './Components/InputField';
import Numbers from './Components/Numbers';
import './App.css';
class App extends Component {
constructor(props) {
super(props);
this.state = {
number: 0,
val1: 0,
val2: 0
}
}
numberChange(num1, num2){
this.setState({val1: num1});
}
render() {
return (
<div className="App">
<InputField val1={this.state.val1} value={this.state.number || ''} onChange={this.numberChange.bind(this)} />
<Numbers onChange={this.numberChange.bind(this)} />
</div>
);
}
}
export default App;
InputField.js
import React, {Component} from 'react';
class InputField extends Component {
constructor(props) {
super(props);
this.state = {
number: 0
}
}
onChange(e) {
console.log('onChange event fired');
this.setState({
number: e.target.value
})
this.props.onChange(this.state.number);
console.log(this.state.number);
}
render() {
return (
<div className="inputField">
<input type="number" value={this.props.val1 || ''} onChange={this.onChange.bind(this)}/>
</div>
);
}
}
export default InputField;
Numbers.js
import React, {Component} from 'react';
import {Button} from 'react-bootstrap'
class Numbers extends Component {
constructor(props) {
super(props);
this.state = {
number: props.value
}
}
number(e) {
console.log('You\'ve pressed number ' + e.target.value);
this.setState({
number: e.target.value
})
this.props.onChange(this.state.number);
}
render() {
return (
<div className="buttons">
<Button bsStyle="primary" value="1" onClick={this.number.bind(this)}>1</Button>
<Button bsStyle="primary" value="2" onClick={this.number.bind(this)}>2</Button>
<Button bsStyle="primary" value="3" onClick={this.number.bind(this)}>3</Button>
<Button bsStyle="primary" value="4" onClick={this.number.bind(this)}>4</Button>
<Button bsStyle="primary" value="5" onClick={this.number.bind(this)}>5</Button>
<Button bsStyle="primary" value="6" onClick={this.number.bind(this)}>6</Button>
<Button bsStyle="primary" value="7" onClick={this.number.bind(this)}>7</Button>
<Button bsStyle="primary" value="8" onClick={this.number.bind(this)}>8</Button>
<Button bsStyle="primary" value="9" onClick={this.number.bind(this)}>9</Button>
</div>
);
}
}
export default Numbers;
任何帮助将不胜感激!
最佳答案
setState是一个异步函数,这意味着仅在调用onChange回调函数后才更新数据。因此,应用程序组件仍会获得this.state.number
的旧值。
在setState完成后,尝试通过以下方式调用onChange函数:
number(e) {
console.log('You\'ve pressed number ' + e.target.value);
this.setState({
number: e.target.value
}, () => {
this.props.onChange(this.state.number);
})
}
More info here