如何使用setState以便状态立即更改

时间:2018-12-22 02:17:36

标签: javascript reactjs

我是reactjs的新手,我想建立一个表单,该表单的值最初是从API响应中获取的,然后用户可以在保存表单之前对表单的字段进行更改。在此,当用户更改本金时,半额期初余额期末余额应根据用户的输入。我可以更改字段,但是它们是用户输入后的一种状态更改。我认为这是因为 setState 的异步特性,但是对于我的示例,我不知道如何处理回调。我想知道如何解决此问题。 我的代码的链接为here

import React, { Component } from "react";
import ReactDOM from "react-dom";

import "./styles.css";
class App extends Component {
  constructor(props) {
    super();
    this.state = {
      get_interest: 5,
      get_principal: 5,
      get_starting_balance: 10,
      get_closing_balance: 0,
      get_emi_date: "2018-09-12",
      get_emi_amount: 0,
      field: "",
      get_schedule: [
        {
          amount: 2000,
          principal: 0,
          discount: 0,
          date: "2019-01-06",
          interest: 0,
          starting_balance: 1000,
          closing_balance: 0
        },
        {
          amount: 3000,
          principal: 0,
          discount: 0,
          date: "2019-02-06",
          interest: 0,
          starting_balance: 1500,
          closing_balance: 0
        }
      ]
    };
  }
  handleAmortScheduleChange = (key, field) => e => {
    const value = e.target.value;
    const { get_schedule, get_emi_amount } = this.state;
    const old_schedule = get_schedule[key];
    const new_get_schedule = [...get_schedule];
    console.log(old_schedule);
    new_get_schedule[key] = {
      ...old_schedule,
      [field]: value,
      amount: get_emi_amount,
      closing_balance: old_schedule.starting_balance - get_emi_amount
    };

    this.setState(
      {
        get_schedule: new_get_schedule,
        get_emi_amount:
          parseInt(new_get_schedule[key].principal) +
          parseInt(new_get_schedule[key].interest)
        // [get_schedule[key][field]]: value,
        // [get_emi_amount]: get_schedule[key]["principal"] + get_schedule[key]["interest"],
        // [get_schedule[key]["closing_balance"]]: get_schedule[key]["starting_balance"] - get_emi_amount,
      },
      () => {
        console.log(this.state.get_schedule);
        console.log(this.state.old_schedule);
      }
    );
    var arr = document.getElementsByName("get_schedule_principal_here");
    var tot = 0;
    for (var i = 0; i < arr.length; i++) {
      if (parseInt(arr[i].value)) tot += parseInt(arr[i].value);
    }
    document.getElementById("get_total_principal").value = tot;
    var arr_interest = document.getElementsByName("get_schedule_interest_here");
    var tot_interest = 0;
    for (var i = 0; i < arr_interest.length; i++) {
      if (parseInt(arr_interest[i].value))
        tot_interest += parseInt(arr_interest[i].value);
    }
    document.getElementById("get_total_interest").value = tot_interest;
  };
  render() {
    const { get_schedule, get_emi_amount } = this.state;
    return (
      <div className="App">
        {this.state.get_schedule.map((row, key) => (
          <div key={key} className="row aaaa">
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_emi_date"
                type="date"
                required="required"
                id="get_schedule_emi_date"
                value={row.date}
              />
              <label for="input" className="getAmort-control-label">
                EMI Date
              </label>
              <i className="getAmort-bar" />
            </div>
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_emi_amount"
                type="number"
                required="required"
                id="get_schedule_emi_amount"
                value={get_schedule[key].amount}
              />
              <label for="input" className="getAmort-control-label">
                EMI Amount
              </label>
              <i className="getAmort-bar" />
            </div>
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_principal"
                type="number"
                required="required"
                id="get_schedule_principal"
                name="get_schedule_principal_here"
                value={get_schedule[key].principal}
                onChange={this.handleAmortScheduleChange(key, "principal")}
              />
              <label for="input" className="getAmort-control-label">
                Principal
              </label>
              <i className="getAmort-bar" />
            </div>
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_interest"
                type="number"
                required="required"
                id="get_schedule_interest"
                value={get_schedule[key].interest}
                onChange={this.handleAmortScheduleChange(key, "interest")}
              />
              <label for="input" className="getAmort-control-label">
                Interest
              </label>
              <i className="getAmort-bar" />
            </div>
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_starting_balance"
                type="number"
                required="required"
                id="get_schedule_starting_balance"
                value={row.starting_balance}
              />
              <label for="input" className="getAmort-control-label">
                Starting Balance
              </label>
              <i className="getAmort-bar" />
            </div>
            <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
              <input
                ref="get_schedule_closing_balance"
                type="number"
                required="required"
                id="get_schedule_closing_balance"
                value={get_schedule[key].closing_balance}
              />
              <label for="input" className="getAmort-control-label">
                Closing Balance
              </label>
              <i className="getAmort-bar" />
            </div>
          </div>
        ))}
        <div className="row">
          <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
            <input type="number" required="required" id="get_total_principal" />
            <label for="input" className="getAmort-control-label">
              Total Principal
            </label>
            <i className="getAmort-bar" />
          </div>

          <div className="getAmort-form-group col-xs-12 col-sm-12 col-md-2 col-lg-2">
            <input type="number" required="required" id="get_total_interest" />
            <label for="input" className="getAmort-control-label">
              Total Interest
            </label>
            <i className="getAmort-bar" />
          </div>
        </div>
      </div>
    );
  }
}
const rootElement = document.getElementById("root");

ReactDOM.render(<App />, rootElement);

0 个答案:

没有答案