我的组件正在根据用户执行更改之前和之后的结果执行计算,并且出于某种原因,该组件似乎多次运行该函数而不是每次更改一次,这导致结果不准确。关于可能导致问题的原因有什么建议吗?
这是代码:
import * as React from 'react';
import { ILiquidiManagerProps } from './ILiquidiManagerProps';
import {AccountValue} from './AccountFields';
import {LiquidTEUR} from './DummyContent';
interface SubtotalState {
Account?: any,
SubtotalValue?: any,
iteration?: number,
}
export default class SubtotalValues extends React.Component<ILiquidiManagerProps, SubtotalState> {
public constructor(props: ILiquidiManagerProps) {
super(props);
this.state = {
Account: LiquidTEUR.Subcategories.find(item => item.Name == this.props.label),
SubtotalValue: 0,
}
}
private getText = data => {
this.setState({SubtotalValue: data});
}
private initiateValue = () => {
let Account = this.state.Account;
let subtotal = 0;
Account.Accounts.map((item) => {
subtotal += item.Value;
})
this.setState({SubtotalValue: subtotal});
}
componentDidMount(){
this.initiateValue();
}
componentDidUpdate(_prevProps, prevState){
if (this.state.SubtotalValue !== prevState.SubtotalValue){
let total = this.props.liquidTotal;
if(this.props.label == 'Kreditlinien in TEUR'){
total = total + prevState.SubtotalValue - this.state.SubtotalValue;
} else {
total = total - prevState.SubtotalValue + this.state.SubtotalValue;
}
this.props.getValue(total);
}
}
public render(): React.ReactElement<ILiquidiManagerProps> {
console.log(this.props.liquidTotal + "Subtotal");
return(
<React.Fragment>
<a className="collapsible" href="#">
<div
className={`p-2 text-right value ` + this.props.bgColor + ` font-weight-bold ` + this.props.textColor}
data-date={this.props.date}
data-name={this.props.label}
>{this.state.SubtotalValue.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".")}</div></a>
<div className="content hidden">
{this.state.Account.Accounts.map((item, key) => {
return <AccountValue key={key} label={item.Value} getValue={this.getText} subtotal={this.state.SubtotalValue} />;
})}
<span className="add-pos"> </span>
</div>
</React.Fragment>
);
}
}
答案 0 :(得分:0)
所以我发现了问题。 getText 函数正在从另一个组件获取值,该值初始为 0,但随后从另一个组件接收另一个值。延迟导致状态更新,并且由于值不同,componentDidUpdate 在初始化时触发。
我在另一个组件的 ComponentWillMount 上使用了异步函数,这似乎解决了问题:
async componentWillMount(): Promise<void> {
this.LiquidTotal();
}