React新舊版本對比總結(jié)歸納(生命周期篇)

生命周期

我們先來看下React16.0前后生命周期變化的圖片

生命周期圖譜:http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

16.0版本前
16.0版本后

? 過時生命周期:

① componentWillMount

② componentWillReceiveProps

③ componentWillUpdate

? 即將過時生命周期:(在新代碼中我們應(yīng)該避免使用它們)

① UNSAFE_componentWillMount

② UNSAFE_componentWillReceivePorps

③ UNSAFE_componentWillUpdate

? 新增生命周期

① getDerivedStateFromProps

②?getSnapShotBeforeUpdate

③ getDerivedStateFromError

④ componentDidCatch

老生命周期我就不贅述了,下邊我歸納下我對幾個新生命周期用法的理解

①?static getDerivedStateFromProps(nextProps, prevState)

○ 什么時候調(diào)用凑队?

這個方法會在調(diào)用 render 方法之前調(diào)用则果,并且在初始掛載及后續(xù)更新時都會被調(diào)用。它應(yīng)返回一個對象來更新 state漩氨,如果返回 null 則不更新任何內(nèi)容西壮。

○ 返回值

返回值是必須的,它應(yīng)該是一個對象叫惊,用于更新state; 如果返回值為null款青,state不更新。

○ 主要用途霍狰?

這個生命周期函數(shù)是為了替代componentWillReceiveProps存在的抡草,所以在你需要使用componentWillReceiveProps的時候饰及,就可以考慮使用getDerivedStateFromProps來進(jìn)行替代。主要是將新的props更新到state上

特別說明:

它是靜態(tài)方法康震,所以它沒有this(實例對象無法訪問)旋炒,只能通過類名訪問。

看下邊例子就明白了签杈!

class Child extends Component {

? ? constructor(props) {

? ? ? ? super(props);

? ? ? ? this.state= {

? ? ? ? ? ? info: props.info || "hello world"

? ? ? ? }

}

? ? static getDerivedStateFromProps(nextProps, prevState) {

? ? ? ? if (nextProps.info!== prevState.info) {

? ? ? ? ? ? return ({

? ? ? ? ? ? ? ? info: nextProps.info

????????????})

????????}

? ? ? ? return null;

? ? }

? ? render() {

? ? ? ? return (

? ? ? ? ? ? <p>{this.state.info}</p>

? ? ? ? ????????????)

? ? ? ?}

?}

class App extends Component {

? ? constructor(props) {

? ? ? ? super(props);

? ? ? ? this.state= {

? ? ? ? ? ? childInfo: "Hello world"

? ? ? ? }

????}

? ? clickHandler = () => {

? ? ? ? this.setState({

? ? ? ? ? ? childInfo: "Changed world"

? ? ? ? })

? ? };

? ? render() {

? ? ? ? return (

? ? ? ? ? ? <>

? ? ? ? ? ? ? ? <Child info={this.state.childInfo}/>

? ? ? ? ? ? ? ? <button onClick={this.clickHandler}>Click Me</button>

? ? ? ? ????</>

? ? ? ? );

? ? }

}

②?getSnapshotBeforeUpdate(prevProps, prevState)

○ 什么時候調(diào)用瘫镇?

getSnapshotBeforeUpdate()?在最近一次渲染輸出(提交到 DOM 節(jié)點)之前調(diào)用。

○ 返回值

應(yīng)返回 snapshot 的值(或?null)

○ 有什么用途答姥?

它使得組件能在發(fā)生更改之前從 DOM 中捕獲一些信息(例如铣除,滾動位置)。此生命周期的任何返回值將作為參數(shù)傳遞給?componentDidUpdate()鹦付。

此用法并不常見尚粘,但它可能出現(xiàn)在 UI 處理中,如需要以特殊方式處理滾動位置的聊天線程等敲长。

③ static getDerivedStateFromError(error)

○ 什么時候調(diào)用郎嫁?

此生命周期會在渲染階段后代組件拋出錯誤后被調(diào)用,因此不允許出現(xiàn)副作用祈噪。

○ 返回值

它將拋出的錯誤作為參數(shù)泽铛,并返回一個值以更新 state

○ 有什么用途?

主要用于封裝錯誤邊界用辑鲤,收集錯誤信息并做對應(yīng)處理盔腔。

以下為具體用法用例

class ErrorBoundary extends React.Component {

? ? constructor(props) {

? ? ? ? super(props);

? ? ? ? this.state= {hasError: false};

? ? }

? ? static getDerivedStateFromError(error) {

? ? ? ? // 更新 state 使下一次渲染可以顯降級UI

? ? ? ? return {hasError: true};

? ? }

? ? render() {

? ? ? ? if (this.state.hasError) {

? ? ? ? ? ? // 你可以渲染任何自定義的降級UI

? ? ? ? ? ? return <h1>Something went wrong.</h1>;

? ? ? ? }

? ? ? ? return this.props.children;

? ? }

}

然后你可以將它作為一個常規(guī)組件去使用:

<ErrorBoundary>

? ? <div>Hello world</div>

</ErrorBoundary>

④ componentDidCatch(error, info)

○ 什么時候調(diào)用?

此生命周期會在“提交”階段后代組件拋出錯誤后被調(diào)用月褥,因此允許執(zhí)行副作用弛随。

○ 參數(shù)

error?—— 拋出的錯誤。

info?—— 帶有?componentStack?key 的對象宁赤,其中包含有關(guān)組件引發(fā)錯誤的棧信息舀透。

○ 返回值

它將拋出的錯誤作為參數(shù),并返回一個值以更新 state

○ 有什么用途决左?

主要用于封裝錯誤邊界用愕够,收集錯誤信息并做對應(yīng)處理。

用例如下:

class ErrorBoundary extends React.Component {

? ? constructor(props) {

? ? ? ? super(props);

? ? ? ? this.state= { hasError: false };

? ? }

? ? static getDerivedStateFromError(error) {

? ? ? ? // 更新 state 使下一次渲染可以顯示降級UI

? ? ? ? return { hasError: true };

? ? }

? ? componentDidCatch(error, info) {

? ? ? ? // "組件堆棧" 例子:

//? in ComponentThatThrows (created by App)

//? in ErrorBoundary (created by App)

//? in div (created by App)

//? in App

? ? ? ? logComponentStackToMyService(info.componentStack);

? ? }

? ? render() {

? ? ? ? if (this.state.hasError) {

? ? ? ? ? ? // 你可以渲染任何自定義的降級UI

? ? ? ? ? ? return <h1>Something went wrong.</h1>;

? ? ? ? }

? ? ? ? return this.props.children;

? ? }

}

特別注意:

如果發(fā)生錯誤哆窿,你可以通過調(diào)用?setState?使用?componentDidCatch()?渲染降級 UI链烈,但在未來的版本中將不推薦這樣做。 可以使用靜態(tài)?getDerivedStateFromError()?來處理降級渲染挚躯。

結(jié)論:對于新生命周期③和④作用基本是一致的强衡,都是用于封裝錯誤邊界,收集邊界下后代組件構(gòu)造函數(shù)中發(fā)生的錯誤信息并作出對應(yīng)處理码荔。不同的是調(diào)用時間和返回參數(shù)漩勤。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末感挥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子越败,更是在濱河造成了極大的恐慌触幼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究飞,死亡現(xiàn)場離奇詭異置谦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亿傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門媒峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人葵擎,你說我怎么就攤上這事谅阿。” “怎么了酬滤?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵签餐,是天一觀的道長。 經(jīng)常有香客問我盯串,道長氯檐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任嘴脾,我火速辦了婚禮男摧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘译打。我一直安慰自己,他們只是感情好拇颅,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布奏司。 她就那樣靜靜地躺著,像睡著了一般樟插。 火紅的嫁衣襯著肌膚如雪韵洋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天黄锤,我揣著相機(jī)與錄音搪缨,去河邊找鬼。 笑死鸵熟,一個胖子當(dāng)著我的面吹牛副编,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播流强,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼痹届,長吁一口氣:“原來是場噩夢啊……” “哼呻待!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起队腐,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蚕捉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柴淘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫淹,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年为严,在試婚紗的時候發(fā)現(xiàn)自己被綠了千绪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡梗脾,死狀恐怖荸型,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情炸茧,我是刑警寧澤瑞妇,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站梭冠,受9級特大地震影響辕狰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜控漠,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一蔓倍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盐捷,春花似錦偶翅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滞诺,卻和暖如春形导,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背习霹。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工朵耕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淋叶。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓阎曹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芬膝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350