1.过时的生命周期(v16.3之前)

1.当前组件初次渲染:

绿色表示执行顺序。

constructor(): 如果不需要初始化,可以直接省略,会自动补全该函数。

可以在这个方法中初始化this.state。也可以直接直接在类的顶部初始化实例属性:state = {}

并且一定要调用super(props);如果只调用super(); 在constructor中无法访问this.props.

另外,属性可以设置默认值,使用静态属性defaultProps.

constructor(props) {
super(props);
this.state = { number: 0 }
}

componentWillMount():   render()之前触发。(服务器端渲染唯一会调用的周期函数)

16.3之后改为UNSAFE_componentWillMount,不能和新的周期一起使用。无UNSAFE_前缀的,17.0以后将不能再使用。

UNSAFE不代表不安全,指的是在未来React版本中更可能出错,特别是异步渲染应用后。

原因

1)如果在该周期中监听或者(订阅)。会出现服务端渲染(永远不调用componentWillUnMount)和

异步渲染(渲染中断而不调用componentWillUnMount),导致内部不能释放,出现内存泄漏。

2)如果进行异步请求。服务器端渲染可能请求的数据不会被使用,异步渲染可能导致发起多次请求。

替代解决方案

1)如果在该周期中调用setState,因为在render()前触发,不会触发额外渲染。

相当于初始化state。在constructor方法中初始化状态。

2)对于订阅等副作用处理转移至componentDidMount()

this.state.number === 0

render():  唯一必须存在的方法,且必须返回一个元素或者null。

this.state.number === 0

componentDidMount(): 页面挂载(插入DOM)之后,立即调用。永远只调用一次!!

 用法:

1)在此进行针对DOM的操作。 因为在此之前的所有周期都取不到真实的DOM节点。在此之后都可以取到。

2)在此进行订阅。记得UnMount时取消订阅。

3)在此进行网络数据请求。

this.state.number === 0

2.当前组件状态state发生更新

add = () => {
this.setState({
number: this.state.number + 1
})
}

shouldComponentUpdate(nextPorps,nextState):  返回布尔值。用于性能优化。

建议直接使用React.PureComponent。 后续版本可能false也不能阻止更新。

此周期范围内,this.state, this.props的值仍未发生变化

this.state.number === 0

componentWillUpdate(nextProps, nextState):  当组件的state发生变化都会进入该周期,作为render()前的最后准备。

此周期范围内,this.state, this.props 的值仍未发生变化

this.state.number === 0

❎不能在无任何条件的情况下,调用setState或者diapatch修改Redux的状态

16.3之后改为UNSAFE_componentWillUpdate(nextProps,nextState),不能和新周期一起使用。 且无UNSAFE_前缀,17.0以后将不能再使用。

原因:

1)很多人使用该周期函数,是怕来不及更新。

但是,React保证在用户看到UI前(更新屏幕前),确保componentDidMount和componentDidUpdate之间的所有的setState都刷新完。所以在componentDidUpdate中一样。

2)在异步渲染中一次更新可能导致多次调用。但是componentDidMount确保只执行一次。

替代方案: getSnapshotBeforeUpdate()配合componentDidUpdate()

render();         离开上个周期立即调用,this.state等值发生变化

this.state.number === 1

componentDidUpdate(prevProps, prevState): DOM和Refs更新后被立即调用。

其中的prevProps在props触发的渲染中,是props更改之前的状态,prevState就是当前状态。

在setState触发的渲染中,prevProps就是当前传入的props, prevState是setState之前的state状态。

❎不能在无任何条件的情况下,调用setState或者diapatch修改Redux的状态。会出现死循环。

this.state.number === 1

3.子组件更新(props变化)

<Sub subNumber={this.state.number} />

componentWillReceiveProps(nextProps): 只要父组件重新渲染,不论props是否变化,都会进入该生命周期。

组件“挂载阶段”不会触发该方法;本组件setState也不会触发该方法。

16.3之后改为UNSAFE_componentWillUpdate(nextProps,nextState),不能和新周期一起使用。 且无UNSAFE_前缀,17.0以后将不能再使用。

原因: 异步渲染可能会一次更新,多次调用。

 替代方案:getDerivedStateFromProps()

this.props ---> {number: 0}   nextProps--->{number: 1}

shouldComponentUpdate(nextPorps,nextState);

this.props ---> {number: 0}   nextProps--->{number: 1}

componentWillUpdate(nextProps, nextState);

this.props ---> {number: 0}   nextProps--->{number: 1}

render();

this.props ---> {number: 1} 

componentDidUpdate(prevProps, prevState);

prevProps-->{number: 0}  this.props ---> {number: 1} 

4. 卸载组件

componentWillUnmount(): 当组件从DOM中移除时触发。

⚠️:在此要清理所有的订阅或者定时器等!!!

{
this.state.show ? <Sub /> : null
}// show为false组件卸载

2. 新的生命周期(V16.3+)

V16.4修复了getDerivedStateFromProps的内容。

1.当前组件初次加载

constructor(props):同上。

static getDerivedStateFromProps(nextProps, state):  根据props的值和state的值,如果有变化返回新的state状态对象。

如果没有变化,返回null; 每次渲染(初次渲染和更新,不论props或者state的值是否有变化)都会调用。

该生命周期设计成静态方法的原因:

静态方法是类上的方法,不是实例上的方法。在该生命周期中取不到this, 不能调用setState等实例方法,保证方法的纯粹;

该方法就是用来通过父组件的props来更新state, 返回增量state对象。

作用:通过props和state计算新的state,用于更新。

❎保守使用该方法。该方法中不能使用this,不能访问组件实例。  

保守方案

1)避免派生状态导致多数据源,使用完全受控,即数据完全由props提供。

2)如果想通过props重置state状态。有三种方案

a.

React中生命周期的更多相关文章

  1. react.js 生命周期componentDidUpdate的另类用法:防止页面过渡刷新

    场景:数据新增成功之后,需要返回原来的查询表,这时候的查询,需要使用react的生命周期:componentDidUpdate componentDidUpdate() 这个生命周期的作用是当prop ...

  2. React的生命周期

    我们先来看一张图,其实看完这张图基本就懂了,如果还不懂,请继续往下看. getDefaultProps 执行过一次后,被创建的类会有缓存,映射的值会存在this.props,前提是这个prop不是父组 ...

  3. 附实例!图解React的生命周期及执行顺序

    本文由云+社区发表 作者:前端林子 1.七个可选的生命周期 可以结合下图来看: (1) componentWillMount() 仅在render()方法前被调用一次,如果在该方法中调用了setSta ...

  4. React之生命周期

    哈喽,这是我的第一篇博客,请大家多多关照~ 追根溯源:What's the lifeCycle? 生命周期函数指在某一时刻组件会自动调用执行的函数: React生命周期概览: 接下来我们就着生命周期的 ...

  5. React组件生命周期小结

    React组件生命周期小结 下面所写的,只适合前端的React.(React也支持后端渲染,而且和前端有点小区别,不过我没用过.) 相关函数 简单地说,React Component通过其定义的几个函 ...

  6. React—组件生命周期详解

    React—组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢 ...

  7. React 函数生命周期

      React 函数生命周期基础 1 ,概念 在组件创建.到加载到页面上运行.以及组件被销毁的过程中,总是伴随着各种各样的事件,这些在组件特定时期,触发的事件,统称为组件的生命周期:* 2,组件生命周 ...

  8. 帮你理清React的生命周期

    这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...

  9. 七天接手react项目 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法

    生命周期&受控和非受控组件&Dom 元素&Diffing 算法 生命周期 首先回忆一下 vue 中的生命周期: vue 对外提供了生命周期的钩子函数,允许我们在 vue 的各个 ...

随机推荐

  1. HNUSTOJ-1617 Graph(费马数)

    1617: Graph 时间限制: 1 Sec  内存限制: 32 MB提交: 31  解决: 5[提交][状态][讨论版] 题目描述 Your task is to judge whether a ...

  2. 【Scratch】它跟Mindstorms,有什么区别?

    第197篇文章 老丁的课程 在正式开始这套课程之前,依照老丁的习惯,还是要给大家白话下东西,该怎么学? 本节课,来讲讲我对于学习这个软件(包括和EV3配合起来)的一些看法.同时,也给小朋友们一些编程学 ...

  3. hdu 6182

    A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. WebSocket协议探究(三):MQTT子协议

    一 复习和目标 1 复习 Nodejs实现WebSocket服务器 Netty实现WebSocket服务器(附带了源码分析) Js api实现WebSocket客户端 注:Nodejs使用的Socke ...

  5. GraphQL实战篇(一)

    看过基础篇的都知道,GraphQL创建Schema有两种方式,Schema First和Graph Type,前者使用GraphQL Schema Language类似于EF的DB First:后者和 ...

  6. React实现顶部固定滑动式导航栏(导航条下拉一定像素时显示原导航栏样式)

    摘要 基于react的框架开发一个顶部固定滑动式的酷炫导航栏,当导航栏置顶时,导航栏沉浸在背景图片里:当鼠标滑动滚轮时,导航栏固定滑动并展示下拉样式. JS部分 相关技术栈:react.antd.re ...

  7. Linux环境下Redis安装和常见问题的解决

    Redis是一款非常非常非常好用的缓存数据库,在保存需要定期更新的Token值,或者在保证高并发安全可靠性的场景下,基本上说是必用了. 安装过好多次Redis了,也用过阿里云Redis数据库,但是每次 ...

  8. ASIHTTPRequest源码简单分析

      1.前言      ASIHttprequest 是基于CFNetwork的,由于CFNetwork是比较底层的http库,功能比较少,因此,在ASIHttprequest中实现了http协议中比 ...

  9. [Mac][Python][Jupyter Notebook]安装配置和使用

    Jupyter 项目(以前称为 IPython 项目),提供了一套使用功能强大的交互式 shell 进行科学计算的工具,实现了将代码执行与创建实时计算文档相结合. 这些 Notebook 文件可以包含 ...

  10. PP 各种快捷键

    内容识别 Shitf + F5 (留白填充) 内容识别比例 Alt + Shift +Ctrl +C 取消选区 Ctrl + D Alpha通道 左击 + Ctrl 锐化 先换成Lab颜色 在无颜色的 ...