簡體   English   中英

如何在reactjs中的componentDidUpdate中打破無限循環

[英]How to break infinite loop in componentDidUpdate in reactjs

我目前正在使用reactjs制作儀表板,其中有4個選項卡或按鈕可以正確創建圖表,但是唯一的問題是,當我們單擊不同的儀表板並且在同一面板中具有相同的圖表而不是圖表未更新時,我同時使用了兩個componentDidMount()和componentDidUpdate雖然給出了適當的輸出,但是它創建了一個無限循環,我也已經應用了一些條件,但是它仍然處於無限循環中,有人可以幫我嗎?

這是我的代碼

class BarChartComponent extends React.Component 
{

   constructor(props) 
   {
      super(props);

      this.state = {
         data: null
      }
   };

   componentDidMount()
    {
            var that = this;
            $.ajax({
                    method: "GET",
                    url: "http://10.0.3.8:8050/querydata?query_id="+that.props.id,
                    success: function(data) 
                    {

                        console.log("component did mount method called");
                        console.log(1,JSON.stringify(data));
                        var BarChartData  = [
                        {
                            key: "totals",
                            values: []
                        }
                        ];
                        data.forEach(function (d)
                        {
                            d.value= +d.value
                            BarChartData[0].values.push(d)
                        }) 
                        console.log(2,JSON.stringify(BarChartData))
                        that.setState({data:BarChartData});
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown)
                    { 
                        console.error("Status: " + textStatus);
                        console.error("Error: " + errorThrown); 
                    }       
                });         
    }

    componentDidUpdate(prevProps, prevState)
    {
                if(prevState.data !== this.state.data )
                {
                    var that = this;
                    $.ajax({
                        method: "GET",
                        url: "http://10.0.3.8:8050/querydata?query_id="+that.props.id,
                        success: function(data) 
                        {

                            console.log("component did update method called");
                            var BarChartData  = [
                            {
                                key: "totals",
                                values: []
                            }
                            ];
                            data.forEach(function (d)
                            {
                                d.value= +d.value
                                BarChartData[0].values.push(d)
                            }) 

                            if( prevProps.id !== that.state.id )
                            {
                                that.setState({data:BarChartData});
                                console.log(3,JSON.stringify(BarChartData))
                                console.log(4,JSON.stringify(that.state.data))
                            }                   
                        },
                        error: function(XMLHttpRequest, textStatus, errorThrown)
                        { 
                            console.error("Status: " + textStatus);
                            console.error("Error: " + errorThrown); 
                        }       
                    });         

                }
    }



    render()
    {

        if (this.state.data==null)
        {
            return (<h1>Loading...</h1>);
        }
        return (


             <NVD3Chart type="discreteBarChart" datum={this.state.data} x="name" y="value"/>

        );
    }
}

window.BarChartComponent = BarChartComponent;

if(prevState.data !== this.state.data) 不比較實際對象是否相等。 這就是為什么我假設您的$.ajax請求在componentDidUpdate連續觸發的原因,即使實際數據相同。

如果您真的想使用昂貴的方法,則可以使用lodash_.isEqual )比較對象(或jQuery中的內置方法)。 最終,由於性能原因,這是比較特定數據的更好方法。

我認為最好在componentDidUpdate的頂部使用此檢查:

if (prevProps.id !== this.props.id)

因為您的請求僅取決於此參數。

然后,您將沒有無限循環,因為id具有標量值,並且相等性檢查將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM