状态未在React.js中更新

时间:2020-03-22 06:13:32

标签: javascript react-state-management react-state reactjs

我已经在react.js中创建了一个基本表单,在用户提交表单后,我可以在其中获取值。

但是,当我尝试使用handleSubmit函数更改值时,看不到该状态所做的更改。

我已经复制了一个状态,并且更改已反映在复制状态中。但是当我将旧状态设置为等于更新状态时,更改不会反映出来

我的代码如下

    state = {    
        name: null,
        ContactNumber: null

    }

    handleChange = (event) => {
        this.setState({
            [event.target.name] : event.target.value
        })
    }

    handleSubmit = (event) => {
        event.preventDefault()
        let Copystate = JSON.parse(JSON.stringify(this.state))
        Copystate.ContactNumber = 100

        console.log(Copystate) // displaying the contact number as 100

        this.setState({
            state : Copystate
        })

        console.log(this.state) // displays the number which was submitted in the form

    }
    render(){
        return(
            <div>
                <h2>Form</h2>
                <form onSubmit={this.handleSubmit}>
                    <div>
                        <label>Name</label>
                        <input type="text" name="name" required = {true} onChange = {this.handleChange}/>

                        <label>Contact Number</label>
                        <input type="number" name="ContactNumber" required = {true} onChange = {this.handleChange}/>

                        <button type="submit" label="submit" >Submit</button>
                    </div>
                </form>
            </div>
        );
    }
}

有人可以让我知道我要去哪里了吗?谢谢

3 个答案:

答案 0 :(得分:1)

注意:setState是异步的:文档state-updates-may-be-asynchronous

您可以使用回调函数来获取更新状态

this.setState({state: Copystate}, () => {console.log(this.state)});

或者您可以选择使用async/await

handleSubmit = async (event) => {
  await this.setState({state: Copystate});
  console.log(this.state);
}

这两种方法不会影响重新渲染,因为一旦状态被更新,重新渲染就会继续进行。

如果您在consolerender(),您会发现它应该总是最终进行更新。

render() {
  console.log(this.state);
  return (
    ...
  )
}

答案 1 :(得分:0)

setState是异步的。 因此,您可以执行以下任一操作- 1.在setState中进行回调以记录状态或 2.在render函数中编写控制台语句。

答案 2 :(得分:0)

为什么要这么做?

let Copystate = JSON.parse(JSON.stringify(this.state))
Copystate.ContactNumber = 100

您可以将handleSubmit更改为以下内容:

handleSubmit = (event) => {
        event.preventDefault();
        let { ContactNumber } = this.state;
        ContactNumber = 100;

        console.log(ContactNumber); // displaying the contact number as 100

        this.setState({
            ContactNumber: ContactNumber
        }, () => {
           console.log(this.state) // displays the number which was submitted in the form
        })
    }