2017-07-10 36 views
0

我有一個主要的ag網格用於我的反應app。當點擊一個按鈕(提供新數據)時,它會重新渲染。react:在第二次調用componentWillRecieveProps之後運行一個方法

我想添加一個初始過濾數據的預過濾器。所以我創建了創建我的預過濾器模型的新方法,然後應用它:

initialFilter(){ 
    ... 
    this.state.gridOptions.api.setFilterModel(myView); 
    this.state.gridOptions.api.onFilterChanged(); 
} 

我知道,從測試這個工作(我叫上當選擇行使用的方法的方法和應用過濾器)。

問題是我在哪裏調用該方法?

把它放在componentWillRecieveProps導致無限循環(我假設由於上述兩行代碼)。

我只需要運行方法ONCE(每次點擊一個按鈕)。經過一番探索後,我注意到如果我添加一個計數器在

componentWillRecieveProps(){ 
... 
    if (counter <= 1){ 
     this.initialFilter(); 
     counter++; 
    } 
} 

這將工作。在第二次componentWillRecieveProps被調用後,預過濾似乎工作。不知道爲什麼,但我假設第一次呈現Ag網格,然後第二次,一旦網格呈現,運行我的方法將工作。 (如果我使用if語句條件'counter == 0',我不會看到我的Ag網格被過濾,我假設是因爲某些東西被覆蓋或者沒有要過濾的數據或者其他東西)

這很好一個按鈕被點擊第二個,第三個,等這個時間的方法將不再調用

我最初的計劃是按鈕的onclick改變一個新的布爾狀態變量,和我的IF語句的邏輯應該是:

'如果此狀態布爾值爲true,則等待第二次componentWillRecieveProps被調用,然後運行該方法,然後將布爾值設置爲相反的值'

任何人都可以提供一些建議嗎?

回答

0

我已經成功地用一個稍微好一點的辦法解決這個問題:

在componentsWillRecieveProps我添加了這個:

if (props.preFilter){ 
    this.initialFilter(); 
    counter++; 
    if (counter == 2){ 
     props.preFilterWasApplied(); 
     counter=0; 
    } 
} 

在我父組件我給自己定一個新的狀態切換,這是否如語句被調用。當點擊按鈕狀態切換爲真。計數器初始設置爲0. initialFilter方法運行並被忽略(?),但會讓我再次調用componentsWillRecieveProps。這會導致initialFilter再次運行(此時不會被忽略)並將計數器設置爲2.這將通過第二個if語句並調用父級方法。父方法簡單地將狀態切換回false。計數器重置爲0,準備下一次按鈕點擊。

狀態將繼續保持爲假,直到我再次點擊該按鈕,它將被設置爲false後再次在第二componentsWillReceiveProps調用

如果任何人有一個更優雅的方式做以上,那麼將不勝感激:)

+0

更優雅的解決方案發現:只需將它複製到shouldComponentUpdate並刪除計數器+內部if語句! – user3120554

相關問題