【问题标题】:How can I update the state correctly on change event for form type=range, it gives the previous state如何在表单类型 = 范围的更改事件上正确更新状态,它给出了以前的状态
【发布时间】:2019-07-10 08:54:07
【问题描述】:

我想在句柄更改函数中发生更改事件后在 url 中传递更新的状态。

它传递了以前的状态,而不是给它当前更新的状态。

例如,状态值贷款期限为 13,但当我在控制台记录它时,它显示为 12。当我更改贷款金额时,它显示为 3058,但我记录了 3016,这是之前的状态。

请帮忙

import React, { Component } from "react";
import axios from "axios";

class Form extends Component {
  state = {
    loanAmount: "500",
    loanDuration: "6"

  };

  handleChange = event => {
    event.preventDefault();
    console.log(this.state.loanAmount, this.state.loanDuration);

    axios
      .get(
        `https://ftl-frontend-test.herokuapp.com/interest?
        amount=${this.state.loanAmount}&numMonths=${this.state.loanDuration}`
      )
      .then(resp => {
        this.props.onChange(resp.data);
        this.setState({ loanAmount: this.state.loanAmount, loanDuration: this.state.loanDuration });
      });
  };

  render() {

    return (
      <>
        <form onChange={this.handleChange}>
          <div className="amount form-control">
            <label htmlFor="formControlRange">Loan Amount  </label>

            <span className="rangeAmount">{this.state.loanAmount}</span>
            <input
              type="range"
              className="amountInput form-control-range"
              onChange={event =>
                this.setState({
                  loanAmount: event.target.value
                })}

              value={this.state.loanAmount}

              min="500"
              max="5000"
            />
          </div>
        </form>
        <form onChange={this.handleChange}>
          <div className="duration form-control">
            <label htmlFor="formControlRange">Loan Duration  </label>

            <span className="rangeDuration">{this.state.loanDuration}</span>
            <input
              type="range"
              className="amountInput form-control-range"
              onChange={event =>
                this.setState({
                  loanDuration: event.target.value,
                })}
              value={this.state.loanDuration}


              min="6"
              max="24"
            />
          </div>

        </form >
      </>
    );
  }
}

export default Form;

【问题讨论】:

    标签: javascript reactjs axios state onchange


    【解决方案1】:

    这是因为我们在执行 setState 后无法立即获取状态。这是 React 的功能。你最好使用 componentDidUpdate,它是 React 生命周期的一部分,当组件中有更新时调用。

    您可以像这样更改代码。

    import React, { Component } from "react";
      import axios from "axios";
    
    class Form extends Component {
      state = {
        loanAmount: "500",
        loanDuration: "6"
      };
    
      componentDidUpdate = (prevProps, prevState) => {
        if(prevState.loanAmount !== this.state.loanAmount || prevState.loanDuration !== this.state.loanDuration) {
          console.log(this.state.loanAmount);
          console.log(this.state.loanDuration);
    
        axios
           .get(
             `https://ftl-frontend-test.herokuapp.com/interest?
             amount=${this.state.loanAmount}&numMonths=${this.state.loanDuration}`
           )
           .then(resp => {
             this.props.onChange(resp.data);
             this.setState({ loanAmount: this.state.loanAmount, loanDuration: this.state.loanDuration });
           });
    
    
      };
    
      render() {
    
        return (
          <>
            <form>
              <div className="amount form-control">
                <label htmlFor="formControlRange">Loan Amount  </label>
    
                <span className="rangeAmount">{this.state.loanAmount}</span>
                <input
                  type="range"
                  className="amountInput form-control-range"
                  onChange={event =>
                    this.setState({
                      loanAmount: event.target.value
                    })}
    
                  value={this.state.loanAmount}
    
                  min="500"
                  max="5000"
                />
              </div>
            </form>
            <form>
              <div className="duration form-control">
                <label htmlFor="formControlRange">Loan Duration  </label>
    
                <span className="rangeDuration">{this.state.loanDuration}</span>
                <input
                  type="range"
                  className="amountInput form-control-range"
                  onChange={event =>
                    this.setState({
                      loanDuration: event.target.value,
                    })}
                  value={this.state.loanDuration}
    
    
                  min="6"
                  max="24"
                />
              </div>
    
            </form >
          </>
        );
      }
    }
    
    export default Form;
    

    【讨论】:

    • 非常感谢您的帮助。它正在工作,但有一个小问题,它会一直在控制台上记录数量和持续时间,你有办法阻止它。因为返回我想要的值需要很多时间。
    • 哦,我知道了 prevProps 将是第一个参数,而 prevState 第二个。再次感谢
    • 是的,我在 prevState 和 prevProps 的位置上弄错了。我使用自动完成功能定义。所以它可能发生。我编辑了答案,请接受它作为答案。所以它可以帮助我改善我的个人资料。谢谢。
    • 自动更新。它没有要求我任何形式的批准。继续回答^_^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2019-09-28
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多