React 组件道具仅在第二个 onClick 事件后更改

Ang*_*ges 3 javascript reactjs

我最近开始学习 React,我正在尝试创建一个计算器作为自己的学习练习。

目的是每当我单击数字按钮时,该值就会出现在输入组件中。到目前为止,我已经让它工作了,但该值仅在第二个 onClick 事件上发生变化。

目前 val1 道具在第一次点击时从输入中消失,然后在第二次点击时重新出现,并带有前一个按钮值。

任何关于我的代码结构的提示都非常受欢迎,任何关于构建我的计算器的指导也将是很棒的。我对此还是很陌生。

这是我的代码如下:

应用程序.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;
Run Code Online (Sandbox Code Playgroud)

输入字段.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;
Run Code Online (Sandbox Code Playgroud)

数字.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;
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Kee*_*rop 5

setState 是一个异步函数,这意味着只有在调用 onChange 回调函数后才会更新数据。因此,App 组件仍然获得 的旧值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);
    })
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里