状态未在 React.js 中更新
State not being updated in React.js
我在 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>
);
}
}
谁能告诉我哪里出错了?谢谢
注意: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);
}
这两种方法不会影响重新渲染,因为一旦更新了状态,就会继续重新渲染。
如果您 console
在 render()
中,您会发现它最终应该始终更新。
render() {
console.log(this.state);
return (
...
)
}
setState 是异步的。
因此,您可以执行以下操作之一 -
1. 在 setState 中进行回调以记录状态或
2. 在渲染函数中写入你的控制台语句。
你为什么要这样做?
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
})
}
我在 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>
);
}
}
谁能告诉我哪里出错了?谢谢
注意: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);
}
这两种方法不会影响重新渲染,因为一旦更新了状态,就会继续重新渲染。
如果您 console
在 render()
中,您会发现它最终应该始终更新。
render() {
console.log(this.state);
return (
...
)
}
setState 是异步的。 因此,您可以执行以下操作之一 - 1. 在 setState 中进行回调以记录状态或 2. 在渲染函数中写入你的控制台语句。
你为什么要这样做?
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
})
}