2016-11-27 68 views
19

據我所見,componentWillMount唯一能做的和constructor不能是setState。我們進入第一render()通之前構造函數與componentWillMount; componentWillMount可以做什麼,構造函數不能做什麼?

componentWillMount() { 
    setState({ isLoaded: false }); 
} 

因爲我們還沒有叫render然而,在componentWillMount一個setState將準備狀態對象。這本質上是同樣的事情constructor作用:

constructor(props) { 
    super(props); 
    this.state = { isLoaded: false }; 
} 

但我看到另一個使用情況下componentWillMount是有用的(服務器端)。

讓我們考慮的東西異步:

componentWillMount() { 
    myAsyncMethod(params, (result) => { 
     this.setState({ data: result }); 
    }) 
} 

在這裏我們不能使用constructor作爲分配this.state不會觸發render()

setStatecomponentWillMount?根據React docs

componentWillMount()在安裝發生之前立即被調用。它在render(之前調用 ),因此此方法中的設置狀態將不會觸發重新渲染。避免在此方法中引入任何副作用或 訂閱。

所以,在這裏,我認爲React將爲第一個渲染使用新的狀態值並避免重新渲染。

問題1:這是否意味着,內componentWillMount,如果我們在異步方法的回調調用setState(可以是承諾回調),反應,直到被執行回調塊初始渲染

客戶端(是的,我在服務器端呈現中看到該用例),如果我假設上述條件爲真,那麼直到我的異步方法完成後纔會看到任何內容。

我是否缺少任何概念?

問題2:是任何其他用途的情況下,我可以componentWillMount而已,但不使用constructorcomponentDidMount實現?

+0

每個問題詢問**一個**問題,而不是兩個。 –

+1

*問題1:這是否意味着,內componentWillMount,如果我們調用異步方法的回調的setState(可以是承諾回調),直到執行回調陣營塊初始渲染「*當然不是 - 如何將它知道?反應是強大的,但不是神奇。 –

+0

我想知道我的第一個問題是完全有效的,否則我想知道什麼是'componentWIllMount'實際使用情況。對不起,問兩個問題中的一個問題。我沒有」不想複製在另一個問題我所有的研究案例。:) –

回答

7

這是否意味着,內componentWillMount,如果我們在 異步方法的回調調用的setState直到執行回調(可以是承諾回調),陣營塊 初始渲染?

不,請參閱here

下面的代碼不會阻止渲染(請記住,這將是一個反模式反正上調用setState有)

componentWillMount: function() { 
    new Promise((resolve, reject) => { 
     setTimeout(()=> { 
      resolve(); 
     }, 2000) 
    }).then(() => this.setState({ promiseResult: 'World' })); 
    }, 

問題2:是,我可以實現任何其他使用情況與 componentWillMount只,但不使用構造函數和 componentDidMount?

不,對於ES6類,您可以放棄componentWillMount。它是隻需要如果您使用React.createClass({... })

編輯:顯然,我錯了。感謝@Swapnil指出了這一點。這裏是discussion

陣營拋出一個警告,如果存在其中在修改另一個組件狀態constructor的副作用,因爲它假設期間render()constructorsetState本身和潛在的被調用。因此,期望constructor沒有副作用。

這不,如果你在componentWillMount做到這一點的情況下,不會引發任何錯誤。另一方面,facebook的傢伙也勸阻componentWillMount的副作用。所以如果你沒有副作用,你可以使用constructor而不是componentWillMount。對於副作用,建議使用componentDidMount而不是componentWillMount。無論哪種方式,你都不需要componentWillMount

+3

對於ES6如果我使用的終極版,並希望派遣初始負載的作用,建議派遣在componentWillMount的行動,而不是構造函數。[它說,在這裏(https://github.com/reactjs/react-redux/issues/129) – Swapnil

+0

感謝您指出了這一點,我已經編輯我的答案。 – lustoykov

+0

一兩件事。我的名字是Swapn il not Swapnii:p – Swapnil

相關問題