首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这里,我如何处理正确方法中道具的状态?它不会更新

在这里,我如何处理正确方法中道具的状态?它不会更新
EN

Stack Overflow用户
提问于 2019-01-23 18:32:53
回答 2查看 42关注 0票数 1

为什么“初始结果”和“最终结果”在控制台中是相同的,尽管html中的state.result是不同的和正确的?我搞错了吗?我希望有一个文本输入,以更新结果时,您键入。另外,当你删除一封带有退格的信件时,它不会更新。

我在控制台中打印了值,但这是因为值是过去的,而不是当前的。

代码语言:javascript
复制
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>
    )
  }

}  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-23 18:41:31

因为异步中的setState。最后的结果控制台日志发生在实际设置状态之前。

(同样,当实际更改发生时,组件将重新呈现,这就是为什么您在html中看到正确的值,但控制台日志已经发生。)

从医生那里

setState()不会立即改变this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。对setState的调用不能保证同步操作,为了提高性能,调用可以批处理。

您可以传递一个回调,以检查发生更改后的值。

代码语言:javascript
复制
this.setState({ key: value }, function () {
    console.log(this.state.key)
})
票数 2
EN

Stack Overflow用户

发布于 2019-01-23 18:58:48

当您使用setState()时,您将调用异步函数,而异步函数不会立即响应。这需要时间。如果您需要在setstate()之后检查状态,则应该使用

代码语言:javascript
复制
this.setState({result: this.state.result,()=>console.log(this.state.result))

另外,当状态更新时,您的组件和它的子组件将重新呈现。因此,您可以在呈现函数中读取更新的状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54333566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档