为什么“初始结果”和“最终结果”在控制台中是相同的,尽管html中的state.result是不同的和正确的?我搞错了吗?我希望有一个文本输入,以更新结果时,您键入。另外,当你删除一封带有退格的信件时,它不会更新。
我在控制台中打印了值,但这是因为值是过去的,而不是当前的。
import React from 'react';
export default class TQValueCalculator extends React.Component {
constructor(props) {
super(props);
this.state = ({result:0});
this.input = React.createRef();
this.handleChange = this.handleChange.bind(this);
}
calculateTQValue(letter) {
switch(letter) {
case 'a':
return 1;
case 'b':
return 2;
case 'c':
return 3;
default:
return null;
}
}
handleChange(event) {
this.setState({result: 0})
console.log("Initial Result " + this.state.result);
for (var i = 0; i < this.input.current.value.length; i++) {
this.setState({result: this.state.result +
this.calculateTQValue(this.input.current.value.charAt(i))})
}
console.log("Final Result " + this.state.result);
}
render(){
return(
<div>
<input
type="text"
name="word"
placeholder='Write here...'
defaultValue = ''
ref={this.input}
onInput={this.handleChange}
>
</input>
<p>
Result: {this.state.result}
</p>
</div>
)
}
} 发布于 2019-01-23 18:41:31
因为异步中的setState。最后的结果控制台日志发生在实际设置状态之前。
(同样,当实际更改发生时,组件将重新呈现,这就是为什么您在html中看到正确的值,但控制台日志已经发生。)
从医生那里
setState()不会立即改变this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。对setState的调用不能保证同步操作,为了提高性能,调用可以批处理。
您可以传递一个回调,以检查发生更改后的值。
this.setState({ key: value }, function () {
console.log(this.state.key)
})发布于 2019-01-23 18:58:48
当您使用setState()时,您将调用异步函数,而异步函数不会立即响应。这需要时间。如果您需要在setstate()之后检查状态,则应该使用
this.setState({result: this.state.result,()=>console.log(this.state.result))另外,当状态更新时,您的组件和它的子组件将重新呈现。因此,您可以在呈现函数中读取更新的状态。
https://stackoverflow.com/questions/54333566
复制相似问题