react 生命周期

componentWillMount

1 .在渲染之前調(diào)用柑蛇,在客戶端也在服務(wù)器端
2 .正確調(diào)用的時(shí)候是在component第一次render之前, 所以第一眼看上去覺(jué)得就應(yīng)該在這里去fetch datas.
3 .但是這里有個(gè)問(wèn)題, 在異步請(qǐng)求數(shù)據(jù)中這一次返回的是空數(shù)據(jù), 因?yàn)槭窃凇痳ender’之前不會(huì)返回?cái)?shù)據(jù). 所以在渲染的時(shí)候沒(méi)有辦法等到數(shù)據(jù)到來(lái),也不能在componentWillMount中返回一個(gè)Promise(因?yàn)镻romise的特性之一就是狀態(tài)不可變),或者用setTimeout也是不適合的.正確的處理方式就不要在這里請(qǐng)求數(shù)據(jù),而是讓組件的狀態(tài)在這里正確的初始化.
4 .這個(gè)函數(shù)會(huì)在render之前調(diào)用
5 .constructor函數(shù)和componentWillMount是通用的作用,所以你在構(gòu)造函數(shù)里初始化了組件的狀態(tài)就不必在WillMount做重復(fù)的事情了
6 .服務(wù)端渲染的時(shí)候用這個(gè)生命周期
7 .這里setState不會(huì)觸發(fā)重新渲染
8 .通常推薦使用constructor方法代替
9 .

componentDidMount

1 .在第一次渲染后調(diào)用
2 .之后組件已經(jīng)生成了對(duì)應(yīng)的dom結(jié)構(gòu),可以通過(guò)this.getDomNode()來(lái)訪問(wèn)
3 .可以在這個(gè)方法中使用setTimeout或者ajax等異步操作
4 .

Mounting時(shí)涉及的函數(shù)

1 .constructor:加載的時(shí)候調(diào)用一次拾并,可以初始化state
2 .getDefaultProps:設(shè)置默認(rèn)的props,也可以使用defaultProps設(shè)置組件的默認(rèn)屬性
3 .getIniialState:初始化state,可以直接在constructor中定義this.state
4 .static getDerivedStateFromProps(props,state):組件每次render的時(shí)候咆爽,包括在組件創(chuàng)建之后脆丁,每次獲取新的props,state之后音榜,每次接收新的props之后都會(huì)返回一個(gè)對(duì)象作為新的state,返回null則說(shuō)明不需要更新state,配合componentDidUpdate蔚鸥,可以替代componentWillReceiveProps
5 .static getDerviedStateFromProps()
6 .render
7 .componentDidMount
8 .componentWillMount:這個(gè)生命周期函數(shù)即將過(guò)期惜论,新代碼中應(yīng)該避免使用他。

render()

1 .react最重要的步驟止喷,創(chuàng)建虛擬dom馆类,進(jìn)行diff算法,更新dom樹(shù)都在此進(jìn)行
2 .

componentWillReceiveProps

1 .組件接收到一個(gè)新的props弹谁,更新數(shù)據(jù)時(shí)調(diào)用乾巧,在初始render不會(huì)調(diào)用
2 .也就是只有父組件重新渲染,子組件接收到新的props才會(huì)觸發(fā)更新

shouldComponentUpdate

1 .返回一個(gè)布爾值预愤,在組件接收到新的props或者state調(diào)用沟于,在初始化或者forceUpdate時(shí)不被調(diào)用
2 .在確認(rèn)不更新組件時(shí)使用
3 .只對(duì)新舊props做了淺比較,沒(méi)有深比較,因?yàn)樗容^昂貴

function shallowEqual(obj, newObj) {
 if (obj === newObj) {
 return true;
 }
 const objKeys = Object.keys(obj);
 const newObjKeys = Object.keys(newObj);
if (objKeys.length !== newObjKeys.length) {
 return false;
 }
// 關(guān)鍵代碼,只需關(guān)注 props 中每一個(gè)是否相等植康,無(wú)需深入判斷
 return objKeys.every(key => {
 return newObj[key] === obj[key];
 });
} 

componentWillUpdate

1 .返回一個(gè)布爾值旷太,在組件接收到新的props或者state,但是沒(méi)有render時(shí)調(diào)用,初始化不會(huì)被調(diào)用
2 .千萬(wàn)不要在這個(gè)函數(shù)中調(diào)用this.setState()方法.

componentDidUpdate

1 .組件完成更新之后調(diào)用供璧,初始化時(shí)不會(huì)被調(diào)用

getSnapshotBeforeUpdate(prevProps, prevState)

1 .update發(fā)生的時(shí)候存崖,每次獲取新的props或者state之后,都會(huì)返回一個(gè)新的對(duì)象作為state,返回null則說(shuō)明不會(huì)更新state

componentWillUnmount

1 .在組件從dom移除前輩調(diào)用

static getDerivedStateFromProps

1 .會(huì)在調(diào)用render方法之前調(diào)用睡毒,并且在初始掛載及其后續(xù)更新時(shí)每次都調(diào)用来惧,他返回一個(gè)新的state對(duì)象來(lái)更新state,如果返回null則不會(huì)更新任何內(nèi)容
2 .在state的值任何時(shí)候都取決于props.這個(gè)方法很實(shí)用
3 .但是這個(gè)方法會(huì)有一些bug,如果是以下幾種情況吕嘀,可以使用簡(jiǎn)單的替代方案
4 .不管什么原因违寞,每次render的時(shí)候都會(huì)執(zhí)行這個(gè)函數(shù)

getSnapshotBeforeUpdate

1 .在最近一次渲染輸出之前調(diào)用,還未掛載到dom節(jié)點(diǎn)之前
2 .他使得組件能在發(fā)生更改之前從DOM中捕獲一些信息偶房,比如滾動(dòng)位置趁曼,此生命周期的任何返回值都將作為參數(shù)傳遞給componentDidUpdate

1 .官方用法舉例
class ScrollingList extends React.Component {
  constructor(props) {
    super(props);
    this.listRef = React.createRef();
  }

  getSnapshotBeforeUpdate(prevProps, prevState) {
    // 我們是否在 list 中添加新的 items ?
    // 捕獲滾動(dòng)位置以便我們稍后調(diào)整滾動(dòng)位置棕洋。
    if (prevProps.list.length < this.props.list.length) {
      const list = this.listRef.current;
      return list.scrollHeight - list.scrollTop;
    }
    return null;
  }

  componentDidUpdate(prevProps, prevState, snapshot) {
    // 如果我們 snapshot 有值挡闰,說(shuō)明我們剛剛添加了新的 items,
    // 調(diào)整滾動(dòng)位置使得這些新 items 不會(huì)將舊的 items 推出視圖掰盘。
    //(這里的 snapshot 是 getSnapshotBeforeUpdate 的返回值)
    if (snapshot !== null) {
      const list = this.listRef.current;
      list.scrollTop = list.scrollHeight - snapshot;
    }
  }

  render() {
    return (
      <div ref={this.listRef}>{/* ...contents... */}</div>
    );
  }
}

錯(cuò)誤處理

1 .componentDidCatch(error,info)

1 .此生命周期在后代組件拋出錯(cuò)誤的時(shí)候被調(diào)用
2 .會(huì)在”提交“階段被調(diào)用摄悯,因此允許執(zhí)行副作用,應(yīng)該用于記錄一些錯(cuò)誤日志之類的情況

2 .static getDerivedStateFromError

1 .會(huì)在后代組件拋出錯(cuò)誤之后被調(diào)用愧捕,將拋出的錯(cuò)誤當(dāng)做參數(shù)奢驯,并返回一個(gè)新的值來(lái)更新state
2 .只會(huì)在渲染階段調(diào)用,因此不允許出現(xiàn)副作用次绘。
class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染可以顯降級(jí) UI
    return { hasError: true };
  }

  render() {
    if (this.state.hasError) {
      // 你可以渲染任何自定義的降級(jí)  UI
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children; 
  }
}

forceUpdate

1 .默認(rèn)情況下瘪阁,當(dāng)組件的state,props發(fā)生變化時(shí),組件將會(huì)重新渲染邮偎。如果render方法依賴于其他數(shù)據(jù)管跺,或者說(shuō)想要頁(yè)面立馬渲染,可以調(diào)用forceUpdate強(qiáng)制讓組件重新渲染
2 .調(diào)用forceUpdate會(huì)強(qiáng)制組件調(diào)用render方法禾进,此時(shí)組件會(huì)跳過(guò)該組件的shouldComponentUpdate豁跑,但是子組件會(huì)觸發(fā)正常的生命周期方法
3 .總的來(lái)說(shuō)應(yīng)該避免使用forceUpdate,盡量在render中使用this.props,this.state來(lái)觸發(fā)框架更新

備注

1 .17的時(shí)候會(huì)刪掉WillMount,ReceiveProps,WillUpdate
2 .官網(wǎng)不使用ES6的部分有介紹到這里的東西

1 .聲明默認(rèn)的props
var Greeting = createReactClass({
  getDefaultProps: function() {
    return {
      name: 'Mary'
    };
  },
})

2 .初始化state
getInitialState: function() {
    return {count: this.props.initialCount};
  },

class Hello extends React.Component {
  render() {
    return React.createElement('div', null, `Hello ${this.props.toWhat}`);
  }
}

ReactDOM.render(
  React.createElement(Hello, {toWhat: 'World'}, null),
  document.getElementById('root')
);

注意

1 .willMount和willUpdate會(huì)被多次執(zhí)行泻云,so艇拍,不要放有副作用的處理。

掛載的時(shí)候

1 .constructor
2 .static getDerivedStateFromProps
3 .render
4 .componentDidMount

更新的時(shí)候:當(dāng)props或state發(fā)生變化的時(shí)候會(huì)觸發(fā)更新

1 .static getDerivedStateFormProps
2 .shouldComponentUpdate
3 .render
4 .getSnapshotBeforeUpdate
5 .componentDidUpdate
6 .componentWillUpdate,componentWillReceiveProps.這倆即將過(guò)期宠纯,不要使用

卸載的時(shí)候

setState的時(shí)間

1 .

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淑倾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子征椒,更是在濱河造成了極大的恐慌,老刑警劉巖湃累,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃救,死亡現(xiàn)場(chǎng)離奇詭異碍讨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蒙秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)勃黍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晕讲,你說(shuō)我怎么就攤上這事覆获。” “怎么了瓢省?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵弄息,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我勤婚,道長(zhǎng)摹量,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任馒胆,我火速辦了婚禮缨称,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝迂。我一直安慰自己睦尽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布型雳。 她就那樣靜靜地躺著当凡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪四啰。 梳的紋絲不亂的頭發(fā)上宁玫,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音柑晒,去河邊找鬼欧瘪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匙赞,可吹牛的內(nèi)容都是我干的佛掖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涌庭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芥被!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坐榆,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拴魄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匹中,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夏漱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顶捷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挂绰。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖服赎,靈堂內(nèi)的尸體忽然破棺而出葵蒂,到底是詐尸還是另有隱情,我是刑警寧澤重虑,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布践付,位于F島的核電站,受9級(jí)特大地震影響嚎尤,放射性物質(zhì)發(fā)生泄漏荔仁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一芽死、第九天 我趴在偏房一處隱蔽的房頂上張望乏梁。 院中可真熱鬧,春花似錦关贵、人聲如沸遇骑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)落萎。三九已至,卻和暖如春炭剪,著一層夾襖步出監(jiān)牢的瞬間练链,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工奴拦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媒鼓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓错妖,卻偏偏與公主長(zhǎng)得像绿鸣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子暂氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345