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