2016-09-14 28 views
2

基本上我想一個組件中有這樣的:reactjs:有沒有公共API來檢查,如果組件安裝/卸載

setTimeout(() => 
{ 
    if (this.isMounted()) // NOTE: this does not exist 
    setState({ foo: 123 }); 
}, 5000); 

但是沒有API對於這一點,我錯了?

在卸載的組件上調用setState()被認爲是錯誤(並在開發模式下由React記錄)。

當然,我可以通過設置this._mounted = false等來設置我自己的狀態componentWillUnmount()等,但我不喜歡在不需要的情況下添加私有狀態。

+0

你檢查過'componentDidMount'鉤子嗎? https://facebook.github.io/react/docs/component-specs.html#mounting-componentdidmount – selvagsz

+0

一些討論正在增加新的生命週期鉤子https://github.com/facebook/react/issues/7678 – selvagsz

+0

我已經知道組件的生命週期,無論如何。 –

回答

1

雖然這是確切的場景isMounted()最初創建,目前的建議usage of isMounted() is bad and will be removed in future React versions

相反,您應該檢查是否在卸載組件時正確取消任何異步函數。如果你使用setTimeout,這是很容易只保存超時標識並取消其在componentWillUnmount

this.timeout = setTimeout(() => { 
    this.setState({ foo: 123 }); 
}, 5000); 

... 

componentWillUnmount() { 
    clearTimeout(this.timeout) 
} 

因此,要回答你的問題,不存在和應該有,如果一個組件安裝檢查的API。這是因爲在卸載時,應該清除對組件的所有引用,以便垃圾收集器可以將其從內存中移除。

+0

這正是我不想要的:在我的組件('this.timer')中保留無用的私有屬性只是爲了引用啞定時器。 非常感謝鏈接。 –

+0

基本上Reactjs告訴你創建你自己的'isMounted'私有財產/方法,而不是提供一個。我不喜歡它,因爲我認爲'this.isMounted()'真的很有用(而不僅僅是由於錯誤的編碼)。 –

+1

@Iñaki他們不是無用的 - 他們有一個明確的目的。如果您發現自己在很多地方添加了這些類型的屬性,也許您可​​以製作可重複使用的計時器組件。 –

相關問題