gpt4 book ai didi

javascript - 同时设置多个(相互依赖的)状态值

转载 作者:行者123 更新时间:2023-11-28 03:33:11 27 4
gpt4 key购买 nike

想象一下这段代码:

class App extends React.Component {
state = {
name: "george",
counter: 1
};

onClick() {
this.setState({
counter: 123,
name: this.state.name + this.state.counter
});


}

render() {
return (
<div
className="App"
onClick={() => {
this.onClick();
}}
>
<h1>Hello CodeSandbox</h1>
<h2>{this.state.name}</h2>
<h2>{this.state.counter}</h2>
</div>
);
}
}

如果我单击 div ,输出为:

george1
123

您可以看到state.name的值为george1其中包含当时当前的counteronClick 被调用。不过,state.counter 值本身具有新值。

这怎么解释?因为如果我这样做:

 onClick() {
this.setState({
counter: 123
});

setTimeout(() => {
this.setState({
name: this.state.name + this.state.counter
});
}, 1000);
}

现在输出是

george123
123

基本上是相同的代码,但时间不同。那么如何解释这种行为呢? 为什么在第一种情况下它会将 this.state.counter 的当前值(在点击时)嵌入到 this.state.name 中? 在第二种情况下不是吗?

Demo .

<小时/>

我知道是否希望将 counter 的旧值嵌入到 this.state.name 中,并更新 this.state.counter >,我也可以这样做:

 onClick() {
this.setState({ // even safer to use functional setState here
name: this.state.name + this.state.counter
}, ()=>{
this.setState({ // and here
counter:123
})
});


}

它比第一种方法更安全吗(结果相同)?

最佳答案

您在两个示例中都使用了 counter 的值。不同之处在于计数器的值何时发生变化。在此示例中:

onClick() {
this.setState({
counter: 123,
name: this.state.name + this.state.counter
});

名称为 george1,因为 this.state.counter 仍设置为 1(尚未更新)。

在此示例中:

this.setState({
counter: 123
});

setTimeout(() => {
this.setState({
name: this.state.name + this.state.counter
});
}, 1000);

您首先要更新 counter 的值,因此超时后 this.state.counter 将引用新值,因此 name 值将为 george123

作为旁注,如果您需要在 setState 函数中引用状态,您应该使用回调,以便保证状态的正确值。

关于javascript - 同时设置多个(相互依赖的)状态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57976686/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com