【发布时间】:2020-11-25 10:31:40
【问题描述】:
我的代码如下:
import React, { Component } from 'react';
class Counter extends Component {
constructor() {
super();
this.state = {
counter : 0
}
}
increment() {
const { counter } = this.state;
this.setState({counter : counter+1 });
console.log(counter);
}
render() {
const { counter} = this.state;
return (
<div>
<h1> {counter} </h1>
<button onClick={() => this.increment()}>Click Me</button>
</div>
);
}
}
export default Counter;
我有一个简单的 h1 和一个按钮。程序的行为应该是,当我单击按钮时,计数器的值应该增加 1(在网页和控制台上,因为我也在控制台中打印计数器的值)。问题是,当我单击按钮时,我的网页上的值从 0 变为 1,但在我的控制台中,我仍然看到计数器的值为 0(而不是 1),当我第二次单击按钮时,值从在我的网页上从 1 变为 2,但在我的控制台中,值从 0 变为 1(而不是 2)。谁能告诉我这是怎么回事?
【问题讨论】:
-
那么我应该怎么做才能得到我想要的输出呢?
-
你能告诉我怎么做吗?
-
不使用 prevCounter 有没有其他方法?
-
我的第一条评论有误,以下是更新您的情况的正确方法:
this.setState(prevState => ({ counter: prevState.counter + 1 }), () => console.log(counter)); -
关于
setState的异步特性,两个答案都是正确的。但是在您的情况下,即使它是完全同步的,您也会因为初始解构分配而简单地记录 old 值。由于state.counter是一个标量值,您实际上已将该值复制到counter变量中。之后对state.counter的任何更改都不会反映。演示:jsfiddle.net/vf1kwnuc
标签: javascript reactjs setstate