即使最近還是有點拖延,可還是再看一些關(guān)于React的東西??吹絉eact組件的生命周期的時候,讓我想到了Vue同樣也有生命周期,即使兩個框架在意義上有些不同,但是同樣是一個東西從創(chuàng)建到消亡,類比到
React的組件定義了以下三個過程:
- Mouting(裝載過程):是在組件實例在創(chuàng)建時和插入DOM時調(diào)用的。
- Update(更新過程):當(dāng)組件的
props和state發(fā)生改變時,重新渲染頁面是調(diào)用的。 - Unmounting(卸載過程):組件從DOM中移動時調(diào)用的。
說了這些可能對于沒有接觸過React的人還是蠻陌生的,還是直接說每一個跟過程中有哪些方法可以調(diào)用。
Mounting
constructor
這個方法主要是為組件初始化state和綁定函數(shù)的this環(huán)境用的。
componentWillMount
這個方法是在render()之前調(diào)用的,在這個函數(shù)當(dāng)中不能對組件的state進行設(shè)置(就是this.setState),因為這時候即使修改了狀態(tài)也不會觸發(fā),因為一切都太晚了,所以想在這個方法做的事情都可以提到constructor里面。
This is the only lifecycle hook called on server rendering. Generally, we recommend using the constructor() instead.
render
這是一個最重要的函數(shù),每一個組件這是一個必須要有的函數(shù)。當(dāng)這個函數(shù)被調(diào)用的時候,他會根據(jù)props和state的值返回一個React的組件,這個組件可以是原生的DOm組件也可以是你自己定義的組件;當(dāng)然你也可以返回null和false,這樣告訴React這次組件并沒有什么東西去渲染。
render函數(shù)是一個純函數(shù),所以在這個函數(shù)中不用修改組件的狀態(tài)
componentDidMount
該函數(shù)并不是render運行完就立刻執(zhí)行的,而是組件已經(jīng)裝載(Mounted)在DOM的時候,在這里就可以從遠程加載數(shù)據(jù),也可以發(fā)起網(wǎng)絡(luò)請求(如AJAX)。這里this.setState是會觸發(fā)重繪(re-rendering)。
Update
componentWillReceiveProps
在父組件的render函數(shù)調(diào)用的時候,不論父組件傳遞給子組件的props值有沒有發(fā)生變化,都會觸發(fā)子組件的componentWillReceiveProps的方法。而且通過this.setState方法并不會調(diào)用該函數(shù)。
shouldComponentUpdate
這個函數(shù)在整個組件的生命周期中也是尤為重要。因為這個函數(shù)決定一個組件什么時候不需要渲染。該函數(shù)的會接受新的props值和state值,而觸發(fā),默認(rèn)返回是true值,告訴React繼續(xù)渲染該組件,如果返回flase值則是終止后面的渲染。
其實根據(jù)上述解釋并不會認(rèn)為這是一個重要的函數(shù)!其實React主要火的原因是,會有對每一次的DOM渲染有一個diff算法,找出不同的節(jié)點信息再去渲染那一個節(jié)點,而這一個函數(shù)就是為了提高整體性能的作用。
componentWillUpdate
這個函數(shù)當(dāng)中不能調(diào)用this.setState方法,如果你想更新狀態(tài)讓prop改變的話,還是使用componentWillReceiveProps函數(shù)。該函數(shù)不會在最初的render函數(shù)中調(diào)用。
componentDidUpdate
這里可以操作DOM樹了,因為組件已經(jīng)完成了更新。這里也可以進行網(wǎng)絡(luò)請求,也可以比較本次和上一次的prop值。該函數(shù)不會在最初的render函數(shù)中調(diào)用。
Unmounting
componentWillUnmount
當(dāng)React組件從DOM樹上移除的時候調(diào)用。該函數(shù)的工作主要是和componentDidMount有關(guān)。
以上就是對React生命周期函數(shù)的稍許介紹,有疑問或理解偏頗的地方歡迎指出。