摘要:本文主要介紹之后的生命周期。該方法有兩個(gè)參數(shù)和返回值為對象不需要返回整體,把需要改變的返回即可。必須有一個(gè)返回值,返回的數(shù)據(jù)類型可以有。此生命周期主要用于優(yōu)化性能。最后,說明一點(diǎn)這三個(gè)生命周期在未來版本中會被廢棄。
React16.3.0開始,生命周期進(jìn)行了一些變化。本文主要介紹React16.3.0之后的生命周期。
React16.3.0之前生命周期:16版本之前的react組件的生命周期相信大家已經(jīng)很熟悉。16版本的react對組件的生命周期函數(shù)進(jìn)行了一些修改,下面進(jìn)行詳細(xì)說明。
React16.3.0之前生命周期創(chuàng)建期:
constructor(props, context)
componentWillMount()
render()
componentDidMount()
運(yùn)行時(shí):
props發(fā)生變化時(shí)
componentWillReceiveProps(nextProps, nextContext)
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)
render
componentDidUpdate(prevProps, prevState, snapshot)
state發(fā)生變化時(shí)
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)
render
componentDidUpdate(prevProps, prevState, snapshot)
卸載時(shí)
componentWillUnmount()
React16.3.0之后的生命周期創(chuàng)建期:
constructor(props, context)
static getDerivedStateFromProps(props, status)
render()
componentDidMount()
或者如下生命周期:
constructor(props, context)
componentWillMount() / UNSAFE_componentWillMount()
render()
componentDidMount()
注意: getDerivedStateFromProps/getSnapshotBeforeUpdate 和 componentWillMount/componentWillReceiveProps/componentWillUpdate 如果同時(shí)存在,React會在控制臺給出警告信息,且僅執(zhí)行 getDerivedStateFromProps/getSnapshotBeforeUpdate 【React@16.7.0】
運(yùn)行時(shí):
props發(fā)生變化時(shí)
static getDerivedStateFromProps(props, status)
shouldComponentUpdate(nextProps, nextState, nextContext)
render
getSnapshotBeforeUpdate(prevProps, prevState)
componentDidUpdate(prevProps, prevState, snapshot)
或者如下生命周期:
componentWillReceiveProps(nextProps, nextContext)/UNSAFE_componentWillReceiveProps
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)
render
componentDidUpdate(prevProps, prevState, snapshot)
state發(fā)生變化時(shí)
static getDerivedStateFromProps(props, status)
shouldComponentUpdate(nextProps, nextState, nextContext)
render
getSnapshotBeforeUpdate(prevProps, prevState)
componentDidUpdate(prevProps, prevState, snapshot)
或者如下生命周期:
shouldComponentUpdate(nextProps, nextState, nextContext)
componentWillUpdate(nextProps, nextState, nextContext)/UNSAFE_componentWillUpdate
render
componentDidUpdate(prevProps, prevState, snapshot)
銷毀時(shí)
componentWillUnmount()
新的生命周期圖示:
生命周期詳解 1.constructor(props, context)constructor生命周期,如不需要,可缺省。通常會在 constructor 方法中初始化 state 和綁定事件處理程序。
但是,如果寫了constructor,那么必須在其中調(diào)用super(props);否則可能會引起報(bào)錯(cuò)。
如:
class Base extends Component { constructor(props) { super(); //應(yīng)該為 super(props); } state = { name: this.props.name } //....code }
拋出異常: Uncaught TypeError: Cannot read property "name" of undefined.
同樣,如果定義了context,在state中需要使用this.context去獲取context上的內(nèi)容,則需要super(props, context);
不過,如果你缺省constructor,那么在state中,可以放心的使用 this.props 或者是 this.context,不會引起報(bào)錯(cuò)。
class Base extends Component { state = { name: this.props.name, color: this.context.color } //....code }
初始化的state同樣可以在constructor中定義。如果需要給方法綁定this,那么統(tǒng)一在constructor中進(jìn)行。
2.static getDerivedStateFromProps(props, state)當(dāng)組件的state需要根據(jù)props來改變的時(shí)候可調(diào)用此方法。這個(gè)方法是在 render() 前會被執(zhí)行,每次觸發(fā)render前,都會觸發(fā)此方法。
該方法有兩個(gè)參數(shù)props和state; 返回值為state對象, 不需要返回整體state,把需要改變的state返回即可。如果不需要,可以返回null.
class Base extends Component { state = { age: 20 } static getDerivedStateFromProps(props, state) { return { age: 50 } } render() { // 50 return ({this.state.age}) } }
這個(gè)方法允許組件基于 props 的變更來更新其內(nèi)部狀態(tài),以這種方式獲得的組件狀態(tài)被稱為派生狀態(tài)。應(yīng)該謹(jǐn)慎使用派生狀態(tài),可能會引入潛在的錯(cuò)誤
3.renderReact組件中必須要提供的方法。當(dāng)state或者props任一數(shù)據(jù)有更新時(shí)都會執(zhí)行。
render() 是一個(gè)純函數(shù),因此,不要在其中執(zhí)行setState諸如此類的操作。render必須有一個(gè)返回值,返回的數(shù)據(jù)類型可以有:
null、String、Number、Array、Boolean。
React elements
Fragment
Portal
注意不要在render中調(diào)用setState
4.componentDidMountcomponentDidMount()方法是在組件加載完后立即執(zhí)行,也就是當(dāng)該組件相關(guān)的dom節(jié)點(diǎn)插入到dom樹中時(shí)。該方法在組件生命中只執(zhí)行一次。
一般情況,我們會在這里setState(),或者進(jìn)行接口請求,設(shè)置訂閱等。
class Base extends Component { state = { age: 20 } componentDidMount() { this.fetchDate(); } render() { return (5.shouldComponentUpdate(nextProps, nextState, nextContext){this.state.age}) } //other code }
在渲染新的props或state前,shouldComponentUpdate被調(diào)用,默認(rèn)返回true。forceUpdate()時(shí)不會調(diào)用此方法。
如果shouldComponentUpdate()返回false,那么getSnapshotBeforeUpdate,render和componentDidUpdate不會被調(diào)用。
此生命周期主要用于優(yōu)化性能。
6.getSnapshotBeforeUpdate(prevProps, prevState)在render()的輸出被渲染到DOM之前被調(diào)用。使組件能夠在它們被更改之前捕獲當(dāng)前值(如滾動位置)。這個(gè)生命周期返回的任何值都將作為第三個(gè)參數(shù)傳遞給componentDidUpdate().
7.componentDidUpdate(prevProps, prevState, snapshot)在更新發(fā)生后調(diào)用 componentDidUpdate()。當(dāng)組件更新時(shí),將此作為一個(gè)機(jī)會來操作DOM。如將當(dāng)前的props與以前的props進(jìn)行比較(例如,如果props沒有改變,則可能不需要網(wǎng)絡(luò)請求。
如果組件使用 getSnapshotBeforeUpdate(),則它返回的值將作為第三個(gè)“快照”參數(shù)傳遞給 componentDidUpdate()。否則,這個(gè)參數(shù)是undefined。
8.componentWillUnmount()在組件被卸載并銷毀之前立即被調(diào)用。在此方法中執(zhí)行任何必要的清理,例如使定時(shí)器無效,取消網(wǎng)絡(luò)請求或清理在componentDidMount()中創(chuàng)建的任何監(jiān)聽。
最后,說明一點(diǎn):
componentWillUpdate,componentWillReceiveProps,componentWillUpdate這三個(gè)生命周期在React未來版本中會被廢棄。
而UNSAFE_componentWillUpdate,UNSAFE_componentWillReceiveProps,UNSAFE_componentWillUpdate 未來版本中仍可繼續(xù)使用。
初始化階段(父組件和子組件):
運(yùn)行階段:父組件props/state更新
子組件的shouldComponentUpdate返回false,則子組件其后的生命周期都不在進(jìn)行,但是父組件的生命周期繼續(xù)執(zhí)行。
卸載階段: 卸載父組件
如果本博文給了您一點(diǎn)啟發(fā)或者是幫助,請給我的github點(diǎn)顆Star吧:https://github.com/YvetteLau/...
參考:
https://segmentfault.com/a/11...
https://www.jianshu.com/p/514...
https://blog.csdn.net/qq_2931...
關(guān)注小姐姐的公眾號,和小姐姐一起學(xué)前端。文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/102450.html
摘要:我們目前的計(jì)劃是為不安全生命周期引入別名,和。從現(xiàn)在開始,只有新的生命周期名稱將起作用。從版本開始,更新以響應(yīng)更改的推薦方法是使用新的靜態(tài)生命周期。 注釋:本文是根據(jù)React的官方博客翻譯而成(文章地址:https://reactjs.org/blog/2018...)。主要講述了React之后的更新方向,以及對之前生命周期所出現(xiàn)的問題的總結(jié),之后的React將逐步棄用一些生命周期和...
摘要:更新階段卸載階段兄弟節(jié)點(diǎn)之間的通信主要是經(jīng)過父組件和也是通過改變父組件傳遞下來的實(shí)現(xiàn)的,滿足的設(shè)計(jì)遵循單向數(shù)據(jù)流模型,因此任何兩個(gè)組件之間的通信,本質(zhì)上都可以歸結(jié)為父子組件更新的情況。 你真的了解 React 生命周期嗎? React 生命周期很多人都了解,但通常我們所了解的都是 單個(gè)組件 的生命周期,但針對 Hooks 組件、多個(gè)關(guān)聯(lián)組件(父子組件和兄弟組件) 的生命周期又是怎么樣的...
摘要:一個(gè)組件的生命周期分為三個(gè)部分實(shí)例化存在期和銷毀時(shí)。如果回調(diào)函數(shù)以函數(shù)的方式來指定,那么在組件更新的時(shí)候回調(diào)會被調(diào)用次。 一個(gè)React組件的生命周期分為三個(gè)部分:實(shí)例化、存在期和銷毀時(shí)。 實(shí)例化階段 客戶端渲染時(shí),如下依次被調(diào)用 getDefaultProps() getInitialState() componentWillMount() render() component...
摘要:組件生命周期構(gòu)造方法是對類的默認(rèn)方法,通過命令生成對象實(shí)例時(shí)自動調(diào)用該方法。該生命周期可以發(fā)起異步請求,并。后廢棄該生命周期,可以在中完成設(shè)置渲染組件是一個(gè)組件必須定義的生命周期,用來渲染。該生命周期內(nèi)可以進(jìn)行。 React組件生命周期 constructor( ) 構(gòu)造方法 constructor是ES6對類的默認(rèn)方法,通過 new 命令生成對象實(shí)例時(shí)自動調(diào)用該方法。并且,該方法是...
摘要:卸載階段組件卸載和銷毀老版生命周期之前的生命周期初始化階段涉及個(gè)鉤子函數(shù)這些方法會在組件初始化的時(shí)候被調(diào)用,只跟實(shí)例的創(chuàng)建有關(guān)。 前言:React 的版本從 v15 到 v16.3 ,再到v16.4,現(xiàn)在最新的版本是 v16.8了。其中最大的變化可能是React Hooks的加入,而最令人困惑的卻是它的生命周期,新舊生命周期函數(shù)混雜在一起,難免會讓許多新來者有很多困惑。所以這一篇我們來...
閱讀 1710·2023-04-26 01:02
閱讀 4874·2021-11-24 09:39
閱讀 1810·2019-08-30 15:44
閱讀 2895·2019-08-30 11:10
閱讀 1791·2019-08-30 10:49
閱讀 991·2019-08-29 17:06
閱讀 615·2019-08-29 16:15
閱讀 910·2019-08-29 15:17