2016-03-24 61 views
0

我正在努力對我的組件進行一些更新。我知道我應該不是設置道具裏面的狀態。然而,我不得不這樣做,使我的組件更新正常:React Native接受新的道具,componentWillReceiveProps

componentWillReceiveProps(nextProps) { 
    this.setState({ 
     doctor: nextProps.data.name, 
     address: nextProps.data.address 
    }) 
} 

有沒有更好的方法來做到這一點?是一個最好的辦法,如果我這樣做 - >

componentWillReceiveProps(nextProps) { 
     this.props.data.name = nextProps.data.name; 
     this.props.data.name = nextProps.data.address; 
    }) 
} 

我試圖使用shouldComponentUpdate:

shouldComponentUpdate: function(nextProps, nextState) { 
    return nextProps.id !== this.props.id; 
} 

,但我並沒有爲me.c

+1

不改變組件內的道具,這就是狀態... – dandavis

+0

爲什麼你需要把你的道具進入狀態?你在改變它們嗎?當組件中正在使用的道具改變時,React渲染任何組件! – Idiot211

+0

@ Idiot211,應用程序有ListView它存儲一些收藏夾項目,以不利我通過另一個組件(例如,g細節項目),當我回到ListView時,我仍然不滿意的項目和另一個項目消失。當我使用componentWillReceiveProps並使用新道具更新狀態時,它可以工作。我希望它確實有道理。 –

回答

0

野生工作得非常好猜在這裏。正如我認爲的那樣,您遇到了正確實施shouldComponentUpdate的問題。我相信你會嘗試比較nextProps.data對象,並且總是有不等於的結果,即使數據在內是相等的。其原因是對象引用data對象是不同的。爲了解決這個問題,你應該做一個深入的比較,而不是lodash_.isEqual

正如評論中提到的,更新componentWillReceiveProps中的nextProps是一個可怕的想法。

+0

謝謝,我明白了,謝謝我會看看,可能它像往常一樣愚蠢,我也會看看lodash。 –

+0

您是否設法找到解決方案?我陷入了類似的問題。我正在嘗試在componentWillReceiveProps中設置狀態。 –

1

您的評論,你提到:

我回來的時候到ListView的項目我unfavourited還有 和其他項目消失

這看起來像一個完全不同的一個問題區。我的猜測是你在列表中使用了錯誤的key。可能是一個索引。關鍵字應該始終對您顯示的項目是唯一的,並且索引不是(例如,第一項始終是索引0,並且當您重新排列列表或刪除第一項時,另一項將具有索引0,並且反應不會那麼工作得很好。)Further explanation here

關於「正確地更新組件」:

  • 如果您在新的道具傳,反應過來自動與新道具重新呈現。您不需要爲componentWillReceiveProps做任何事情。
  • componentWillReceiveProps用於更新狀態,基於比較OLD和NEW道具。 (例如,如果要顯示道具中喜歡的數量是增加還是減少)
  • shouldComponentUpdate是可選的。主要目的是提高性能沒有任何功能上的變化對您的組件的工作:告訴早期的組件是不變的。只要您的組件尚未按預期工作,我建議不要包含shouldComponentUpdate
+0

我明白了,我會再次看看組件,也許我在看錯地方,謝謝。 –

相關問題