【问题标题】:State not being updated in React.jsReact.js 中未更新状态
【发布时间】:2020-03-22 06:13:32
【问题描述】:

我在 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>
        );
    }
}

谁能告诉我哪里出错了?谢谢

【问题讨论】:

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


    【解决方案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);
    }
    

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

    如果你在render()console,你会发现它最终应该总是更新。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        你为什么这样做?

        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
                })
            }
        

        【讨论】:

          猜你喜欢
          • 2018-02-19
          • 1970-01-01
          • 2021-12-09
          • 1970-01-01
          • 1970-01-01
          • 2020-04-27
          • 2021-08-17
          • 2021-12-02
          • 2021-07-18
          相关资源
          最近更新 更多