簡單地說偶器,React Component通過其定義的幾個(gè)函數(shù)來控制組件在生命周期的各個(gè)階段的動(dòng)作。
在ES6中脑题,一個(gè)React組件是用一個(gè)class來表示的(具體可以參考官方文檔)件缸,如下:
// 定義一個(gè)TodoList的React組件,通過繼承React.Component來實(shí)現(xiàn)
class TodoList extends React.Component {
...
}
這幾個(gè)生命周期相關(guān)的函數(shù)有:
- 構(gòu)造函數(shù)叔遂,在創(chuàng)建組件的時(shí)候調(diào)用一次他炊。
constructor(props, context)
- 構(gòu)造函數(shù),在創(chuàng)建組件的時(shí)候調(diào)用一次已艰。
constructor(props, context)
- 在組件掛載之前調(diào)用一次痊末。如果在這個(gè)函數(shù)里面調(diào)用setState,本次的render函數(shù)可以看到更新后的state哩掺,并且只渲染一次凿叠。
void componentWillMount()
- 在組件掛載之后調(diào)用一次。這個(gè)時(shí)候嚼吞,子主鍵也都掛載好了盒件,可以在這里使用refs。
void componentDidMount()
- props是父組件傳遞給子組件的誊薄。父組件發(fā)生render的時(shí)候子組件就會(huì)調(diào)用componentWillReceiveProps(不管props有沒有更新履恩,也不管父子組件之間有沒有數(shù)據(jù)交換)。
void componentWillReceiveProps(nextProps)
- 組件掛載之后呢蔫,每次調(diào)用setState后都會(huì)調(diào)用shouldComponentUpdate判斷是否需要重新渲染組件切心。默認(rèn)返回true飒筑,需要重新render。在比較復(fù)雜的應(yīng)用里绽昏,有一些數(shù)據(jù)的改變并不影響界面展示协屡,可以在這里做判斷,優(yōu)化渲染效率全谤。
bool shouldComponentUpdate(nextProps, nextState)
- shouldComponentUpdate返回true或者調(diào)用forceUpdate之后肤晓,componentWillUpdate會(huì)被調(diào)用。
void componentWillUpdate(nextProps, nextState)
- 除了首次render之后調(diào)用componentDidMount认然,其它render結(jié)束之后都是調(diào)用componentDidUpdate补憾。
componentWillMount、componentDidMount和componentWillUpdate卷员、componentDidUpdate可以對應(yīng)起來盈匾。區(qū)別在于,前者只有在掛載的時(shí)候會(huì)被調(diào)用毕骡;而后者在以后的每次更新渲染之后都會(huì)被調(diào)用削饵。
void componentDidUpdate()
- render是一個(gè)React組件所必不可少的核心函數(shù)(上面的其它函數(shù)都不是必須的)。記住未巫,不要在render里面修改state窿撬。
ReactElement render()
- 組件被卸載的時(shí)候調(diào)用。一般在componentDidMount里面注冊的事件需要在這里刪除叙凡。
void componentWillUnmount()
更新方式
在react中劈伴,觸發(fā)render的有4條路徑。
以下假設(shè)shouldComponentUpdate都是按照默認(rèn)返回true的方式狭姨。
首次渲染Initial Render
調(diào)用this.setState (并不是一次setState會(huì)觸發(fā)一次render宰啦,React可能會(huì)合并操作苏遥,再一次性進(jìn)行render)
父組件發(fā)生更新(一般就是props發(fā)生改變饼拍,但是就算props沒有改變或者父子組件之間沒有數(shù)據(jù)交換也會(huì)觸發(fā)render)
調(diào)用this.forceUpdate
下面是我對React組件四條更新路徑地總結(jié):
constructor(props, context)