2017-03-22 83 views
0

我是新來react-router和現在我有我的應用程序下面的呼叫路由用於連接到Github API並檢索特定回購的問題列表。 。無限componentDidUpdate()與反應路由器

然後在Results組成步驟下面的代碼爲它的componentDidMount()

componentDidMount() { 
    const { 
     username, 
     reponame, 
     page, 
     perPage 
    } = this.props.params; 
    this.sendRequest(username, reponame, page, perPage); 
} 

sendRequests主要包含AJAX查詢用於讀取的輸出數據,在此之後它被設置到組件的狀態:

this.state = { 
     data: [], // here 
     lastPage: -1, 
     errorMessage: '' 
    } 

現在這個工作很好,直到想要改變input的值。我看到,Result組件不會卸載。它調用componentWillReceiveProps()並更新現有組件。 AFAIK在componentDidUpdate()執行旁路電話是安全的,所以我剛剛從componentDidMount()複製上面的代碼並粘貼在那裏。這樣,雖然(這是絕對合理的)componentDidMount()被一遍又一遍地調用。

我此刻想出了唯一的解決方法是在sendRequest()本身比較新舊數據並調用setState()它裏面只有當它通過deep-equal包不同,所以它看起來像這樣:

if (!equal(res, this.state.data)) { 
     this.setState({ 
      ...this.state, 
      data: res, 
      lastPage 
     }); 
    } 

這被認爲是一個好的模式,或者有更好的方法來解決這個問題?

+0

你可以做一個字符串比較,如果你既字符串化的對象,這應該會更快。但是如果你只是比較狀態中的數據,那麼它就足以調用'this.setState({data:res})' – Raulucco

回答