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