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. Python列表推导

    一. 列表推导式   ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数, 它以一个字符(长度为1的字符串)作为参数,返回 ...

  2. Spring Cloud Ribbon说明

    浅谈Spring Cloud Ribbon的原理 Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Clo ...

  3. Python【HTML基础】

    HTML基础 HTML(Hyper Text Markup Language)超文本标记语言 #HTML是一种用来描述网页的语言,HTML之于网页就好比建筑图纸之于建筑 +++++++++++++++ ...

  4. Django Simple Captcha的使用

    Django Simple Captcha的使用 1.下载Django Simple Captcha django-simple-captcha官方文档地址 http://django-simple- ...

  5. WUSTOJ 1277: 小吉吉读书(Java)

    1277: 小吉吉读书 题目   有一本 n 页的书,每天都看 ai 页,已知星期 k 买的书,问星期几能看完?更多内容点击标题. 分析   统计出一个星期能看 a 页,看了 a 页又会回到买书的那一 ...

  6. spring cloud微服务实践一

    最近在学习spring框架.其中spring cloud在微服务方面很火,所以在学习过程中,也做一些记录. 注:这一个系列的开发环境版本为 java1.8, spring boot2.x, sprin ...

  7. 2020年AI、CV、NLP顶会最全时间表

    2020年AI.CV.NLP顶会最全时间表 2019-09-01 14:04:19 weixin_38753768 阅读数 40   2020 AI.CV.NLP主流会议时间表,包含会议举办的时间.地 ...

  8. 【转载】使用appium遇到的坑

    问题 1. error: Failed to start an Appium session, err was: Error: Requested a new session but one was ...

  9. React/数据流

    “Props” 当 React 元素为用户自定义组件时,它会将 JSX 所接收的属性(attributes)转换为单个对象传递给组件,这个对象被称之为 “props”. props的只读性 组件无论是 ...

  10. 解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题

    问题描述:     在IE8及以下版本时,点击label标签无法自动触发checkbox的click事件,导致无法产生希望的效果. 原HTML代码: <div class="col-s ...