2016-04-27 42 views
0

據我所知,當收到一個新的prop時,會根據shouldComponentUpdate函數更新一個組件。我有以下容器:組件何時自動更新?

我使用的終極版,我有我的container內以下。

function filterQuestions(allQuestions, answeredQuestions) { 
    var filtered = _.reject(allQuestions, (q) => _.contains(answeredQuestions, q.question.id)) 
    return [...filtered] 
} 

const mapStateToProps = (state) => {  
    return { 
    questions: filterQuestions(state.questions.questions, state.questions.answeredQuestions), 
    } 
} 

我的意圖是,連接component僅更新時的filterQuestions(...)變化的輸出。但是,每當全局store發生更改時,組件都會更新。如果我擺脫filterQuestions並且只是通過state.questions,它會顯示預期的行爲。

我認爲有一些錯誤的filterQuestions的用法,但我不知道到底是什麼的問題。有人能找到我嗎?

回答

1

的陣營終極版包裝不淺平等檢查時,它調用你mapStateToProps功能,比較對以前返回的對象當前返回的對象。如果兩個對象的內容相等,它實際上不會重新渲染「真實」的組件。

每當您使用像map()filter()這樣的數組函數時,您將返回一個新的數組引用。即使兩個數組的內容完全相同,那些將這些數組作爲字段的對象也不會再淺,因此React Redux將重新呈現您的組件。

有兩種主要的方式來處理這個問題:要麼使用memoized選擇功能(如由Reselect包提供的),當輸入實際上已經改變了,所以你只重新運行的過濾,或者在你的真實組件實現shouldComponentUpdate並實現更智能/更復雜的比較邏輯,例如使用_.isEqual()

該Redux常見問題解答也涵蓋此主題:http://redux.js.org/docs/FAQ.html#react-rendering-too-often