React 生命周期函数

1. mounting阶段执行的生命周期函数

constructor()
static getDerivedStateFromProps()
componentWillMount() / UNSAFE_componentWillMount()
render()
componentDidMount()

1.1 render()

render方法是必须的,当render方法被调用是,会首先查看this.propsthis.state然后return下面其中一个类型的信息
 React elements: 通过JSX创建的react 元素,可以被原生的html组件如<div/>,或者用户自定义的组件如<MyComponent />包含
 String and numbers: string和numbers会被渲染成DOM中的文本节点
 Portals: 调用ReactDOM.createPortal方法
 null: 什么都不渲染
 Booleans: 什么都不渲染,一般用于return test && <Child />这种模式,其中test为boolean
 render方法说明: render方法应该是个纯方法,不应该受到组件中state的影响,每次调用应该返回相同的结果,不直接被浏览器所影响;同时当shouldComponentUpdate方法返回false时,render方法将不会执行

Fragments
用于返回多个标签,而不需要添加额外的包裹元素

举个栗子:

render() {
  <Fragment>
    <span>用户名:</span>
    <input type="text" name="userName"/>
  </Fragment>
}

目前Fragment标签只能接收属性key,未来可能添加事件处理方法;当存在多个Fragment元素时,需要添加不同的key值,否则会抛出警告;Fargment也可以用<></>来代替,只是该空标签不能接收参数;

render(){
  return (
    <React.Fragment>
      <li>First item</li>
      <li>Second item</li>
      <li>Third item</li>
    </React.Fragment>
  )
}

1.2 constructor()

constructor()是在React 组件在mounted之前调用的方法,当创建的组件extends React.Component是,在调用constructor()方法内,必须先调用super(props)
官方推荐使用constructor()方法可以用来初始化state属性,只需要将一个对象赋值给this.state即可,不需要调用setState方法

1.3 static getDerivedStateFromProps(props, state)

getDerivedStateFromProps方法在每次render方法调用之前被调用,并且与UNSAFE_componentWillReceiveProps方法只能在父组件引起的re-render时,才能调用不同的是,getDerivedStateFromProps方法在每次render之前都会被调用,并且返回值将被放到state中。

1.3 UNSAFE_componentWillMount

该方法在mounting之前被调用,由于其异步渲染存在不安全行,因此在React 17中将会被去掉,至于其异步渲染不安全原因暂时还没研究

1.4 componentDidMount

该方法在mounting结束后执行,官方推荐在该方法中请求远程数据或者放置定时器等信息,同时定时器等信息需要在componentWillUnMount()方法中清除
:在这里调用setState方法会导致额外的rending,但是这个渲染会在浏览器更新屏幕之前完成,因此不必担心会影响用户的视觉体验。该方法多数情况,会应用于需要根据DOM节点的位置或者大小来展示tooltips或者模态框


2. updating阶段执行的生命周期函数

只有当props或者state改变是才会引起updating,进而组件会被重新渲染
componentWillReceiveProps()/UNSAFE_componentWillReceiveProps
static getDerivedStateFromProps()
shouldComponentUpdate()
componentWillUpdate()/UNSAFE_componentWillUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()

2.1 UNSAFE_componentWillReceiveProps(nextProps)

该方法会在mounted 组件收到新的props之前会被调用,如果需要根据新的props改变来更新state,最好比较新的nextProps和this.props是否不同,再调用setState方法更新state,这样做的原因是,父组件会引起子组件的re-render,从而导致在props没有改变的情况下调用了该方法,所以要保证只有当nextProps和this.props不同时,再更新state;通常情况this.setState不会触发该方法

在新的版本中,不推荐使用该生命周期方法,可以使用static getDerivedStateFromProps根据props的改变计算next state;可以使用componentDidUpdate执行由props改变带来的影响;甚至,有些情况下,你可以同时使用getDerivedStateFromProps和componentDidUpdate方法

2.2 shouldComponentUpdate(nextProps, nextState)

该方法在收到new props或者new state之后,render之前被调用,默认该方法返回true,当返回false时,render方法将不会执行,但是返回false的情况下,不会影响到子组件在他们的state下的重新渲染
通常情况下,当返回false时,UNSAFE_componentWillUpdate(),render()和componentDidUpdate方法不会被执行;当发现组件渲染变慢时,可以将组件改为extends React.PureComponent,这个接口中实现了在shouldComponentUpdate方法中对于props和state浅层次的比较,用于判断是否需要重新渲染组件,可以提高效率,当然也可以自己在该方法中手写根据props和state判断是否需要渲染组件,官方并不推荐使用JSON.stringify()方法进行深层次的比较,这种方法非常低效并且存在很多问题

2.3 UNSAFE_componentWillUpdate(nextProps, nextState)

该方法在收到新的props或者state之后,render方法执行之前被调用;该方法不会再初始化渲染的时候被调用;该方法内不应该调用this.setState()或者dispatch a Redux action 从而引起组件在该方法之前被更新;如果需要在props改变时,更新state状态,应该使用getDerivedStateFromProps()方法;

注:该方法在shouldComponentUpdate方法返回false时并不会被触发

2.4 getSnapshotBeforeUpdate(prevProps, preState)

该方法在最近的渲染被传递到DOM之前被调用,可以准确的在元素改变之前,通过该方法获取当前的值(比如滚动的位置)等,该方法的返回值将作为componentDidUpdate()方法的第三个参数传递到方法内部使用;该方法必须和componentDidUpdate同时使用,不能单独存在;
在异步渲染中,"render"的生命周期函数(比如componentWillUpdate和render)和"提交"的生命周期函数(比如getSnapshotBeforeUpdate和componentDidUpdate)之前会存在延迟,因此类似改变屏幕宽度等操作在异步渲染过程中,如果在componentWillUpdate中取值,得到的值并不准确

2.5 componentDidUpdate(prevProps, prevState, snapshot)

该方法在更新发生之后被调用,第一次render的时候并不会被调用;可以通过该方法在组件更新后操作DOM,同样也是一个很好的发送网络请求的位置,当然这个的前提是,有对新的props和原来的props进行比较不同后再发送请求;同样的当shouldComponentUpdate方法返回false时,该方法不会被调用

3. unmounting阶段的生命周期函数

componentWillUnmount

4. error 处理函数

这个方法主要用于当在rendering,或者其他生命周期函数中或者子组件的构造函数中报错是捕捉错误信息
componentDidCatch()

本文基于React 16.4 官网翻译得

本文目的仅仅是为了个人查找阅读等提供方便
https://blog.csdn.net/zhouziyu2011/article/details/71425057

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容