【问题标题】:React component updates after 2 onSubmit clicks2 次 onSubmit 点击后反应组件更新
【发布时间】:2020-09-11 13:48:04
【问题描述】:

我有一个图表组件,当我在表单中输入数据时第一次单击 onSubmit 时会更新,但是当我再次输入数据时,它需要单击 2 次才能更新图表。我有一个包含表单的 DataVars 组件,将输入添加到 props,然后呈现图表组件 Charter

import React, {Component} from 'react'
import Charter from './Charter'

class DataVars extends Component{
    constructor() {
        super();
        this.state = {
            interest_rate:'0.5',
        }
        this.handleSubmit = this.handleSubmit.bind(this)
    }

    handleSubmit(event){
        event.preventDefault();
        this.setState({
             interest_rate: this.element.value
         },
        () => { console.log("setState completed", this.state) });
    }

    render(){
        return(
        <div>
            <Charter interest_rate={this.state.interest_rate}/>

            <form onSubmit={this.handleSubmit}>
                <input type="text" name="interest_rate" ref={el => this.element = el} />
                <input type="submit" value="Submit" />
            </form>
        </div>

    );
    }
}

export default DataVars


//Charter.js
import React, {Component} from 'react';
import { Line } from 'react-chartjs-2';
import Chart from 'chart.js';

var data = {
  labels: ["Year 1", "Year 2", "Year 3", "Year 4", "Year 5", "Year 6","Year 7","Year 8","Year 9","Year 10"],
  datasets: [
    {
      label: "First dataset",
      data: [],
      fill: false,
      backgroundColor: "rgba(75,192,192,0.2)",
      borderColor: "rgba(75,192,192,1)"
    }
  ]
};

export default class LineDemo extends Component {

  componentDidMount(){
      var initial_value =10
      data.datasets[0].data = this.compoundList(initial_value)
      console.log(data.datasets[0].data[0])
      let lineChart = this.reference.chartInstance
      lineChart.update();
  }

  componentDidUpdate(){
      var initial_value =10
      data.datasets[0].data = this.compoundList(initial_value)
      console.log(data.datasets[0].data[0])
      let lineChart = this.reference.chartInstance
      lineChart.update();
  }

  compoundList(initial_value){
    var current_value =initial_value
    const interest_rate = this.props.interest_rate
    var compoundList =[];

    for (var i =0; i < 10; i++){
      current_value = this.calculateCompound(current_value, interest_rate)
      compoundList.push(current_value);
    }
    return compoundList;
  }

  calculateCompound(current_value, interest_rate){
    return current_value + (current_value * interest_rate)
  }

render(){
  return (
      <div>
        <Line data={data} ref={(reference) => this.reference = reference}/>
        <h1>Interest Rate: {this.props.interest_rate}</h1>
      </div>
    );
  }


}

我尝试在 setState 之后触发控制台日志命令,但我仍然遇到同样的问题。有没有办法只在状态更新后渲染Charter组件而不是异步渲染?

感谢您的意见。

【问题讨论】:

  • 我看到了你的绑定但是试试这个
    this.handleSubmit()}
  • 谢谢@cheesey,但这只会阻止提交一起工作
  • 在更仔细地查看了您的问题之后,我实际上在前一周遇到了类似的问题。不幸的是,当我遇到这个问题时,我只是对几个组件进行原型设计并放弃了组件设计。您可以查看 this.forceUpdate()。 " 你可以通过调用 forceUpdate() 告诉 React 组件需要重新渲染 " reactjs.org/docs/react-component.html#forceupdate
  • 我在 handleSubmit 函数中的 setState 之后尝试了 this.forceUpdate() 但它仍然失败。我在 setState 之前和之后添加了一些日志,我注意到在 setState 发生后状态似乎保留了旧值。我不确定那是不是因为异步运行,但这很奇怪
  • 发现你的问题stackoverflow.com/questions/41233458/… 在你的Charter组件中,你很可能使用传入的道具设置状态值。

标签: reactjs


【解决方案1】:

或者,您可以将数据存储在状态中,并让Line 在状态更改时重新渲染,而不是手动更新,

// charter.js
import React, { Component } from "react";
import { Line } from "react-chartjs-2";
import Chart from "chart.js";

// var data = {
//   labels: [
//     "Year 1",
//     "Year 2",
//     "Year 3",
//     "Year 4",
//     "Year 5",
//     "Year 6",
//     "Year 7",
//     "Year 8",
//     "Year 9",
//     "Year 10"
//   ],
//   datasets: [
//     {
//       label: "First dataset",
//       data: [],
//       fill: false,
//       backgroundColor: "rgba(75,192,192,0.2)",
//       borderColor: "rgba(75,192,192,1)"
//     }
//   ]
// };

export default class Charter extends Component {
  state = {
    data: {
      labels: [
        "Year 1",
        "Year 2",
        "Year 3",
        "Year 4",
        "Year 5",
        "Year 6",
        "Year 7",
        "Year 8",
        "Year 9",
        "Year 10"
      ],
      datasets: [
        {
          label: "First dataset",
          data: [],
          fill: false,
          backgroundColor: "rgba(75,192,192,0.2)",
          borderColor: "rgba(75,192,192,1)"
        }
      ]
    }
  };
  componentDidMount() {
    var initial_value = 10;
    let data = this.state.data;

    data.datasets[0].data = this.compoundList(initial_value);
    console.log(data.datasets[0].data[0]);
    let lineChart = this.reference.chartInstance;
    lineChart.update();
  }

  componentDidUpdate(prevProps) {
    if (prevProps.interest_rate !== this.props.interest_rate) {
      var initial_value = 10;
      let data = this.state.data;
      data.datasets[0].data = this.compoundList(initial_value);
      console.log(data.datasets[0].data[0]);
      // let lineChart = this.reference.chartInstance;
      // lineChart.update();
      this.setState({ ...data });
    }
  }

  compoundList(initial_value) {
    var current_value = initial_value;
    const interest_rate = this.props.interest_rate;
    var compoundList = [];
    console.log("+++ called +++");

    for (var i = 0; i < 10; i++) {
      current_value = this.calculateCompound(current_value, interest_rate);
      compoundList.push(current_value);
    }
    return compoundList;
  }

  calculateCompound(current_value, interest_rate) {
    return current_value + current_value * interest_rate;
  }

  render() {
    return (
      <div>
        <Line
          data={this.state.data}
          ref={reference => (this.reference = reference)}
        />
        <h1>Interest Rate: {this.props.interest_rate}</h1>
      </div>
    );
  }

}

【讨论】:

  • 它的状态驱动是一个比我想出的更好的解决方案。谢谢你:)
【解决方案2】:

设法解决它

this.reference = reference} width={5} height={1} redraw/>

你需要添加重绘

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多