React浅析(二):生命周期

Hi~
如果你是个react开发者,你肯定用过react的周期,熟悉的不能再熟悉了,但是我们还是炒一下隔夜饭,巩固一下姿势吧~


开始讲课啦.png

万事万物都免不了会经历一番“出生(Mount) => 成长(Update) => go die(Unmout)”的过程,React也会有这样的成长。

我们如何知道组件已经进入到哪个阶段呢?只能通过react暴露给我们的钩子函数来知晓,也就是在特定的阶段会执行的函数,也是本篇章的主要内容——react的钩子函数

一、出生

所谓的react出生,也就是页面在挂载前经历的几件大事


image.png
1、constructor()

人刚出生,是不是总会被赋予点什么属性啊,比如性别,身高等

等同于,组件的构造函数中,需要准备一系列对该组件定义的方法和状态。

ES6的规定中,constructor是类的默认方法,也就是说,该方法是在Class的类组件创建中出现,如果没有定义constructor方法,这个方法会被默认添加,也就是说每一个子类都会有constructor方法。

通过React.Component的方式创建出来的组件,其状态state是通过constructor来初始化的。

class MyComponent extends React.Component {//ES6的写法
    constructor(props){
        super(props)
    }
    //如果写上了constructor,就必须在函数中写上super(),此时组件才有this指向,否则会报错!
    //以下省略...
}
2、getDefaultProps() 和 getInitialState()

被赋予属性的过程

这两个方法只适合React.createClass的方式创建出来的组件,用于获取默认的属性props和初始值state

其状态state是通过getInitialState配置组件相关状态

/ ** ES6的实现中去掉了getInitialState这个钩子函数,规定state在constructor中实现   **/

const MyComponent = React.createClass({//ES5的写法
    getInitialState:function(){
        //ES6创建的组件,state放在constructor中初始化
    }
    getDefaultProps:function(){
        //ES6的class创建的组件,可以这样定义:MyComponent.defaultProps = {...}
        return {
            name:'xy'
        }
    }
    //以下省略...
})
3、componentWillMount()

上手术台,准备接生的前奏

将要挂载到页面上,这个方法是唯一一个在render之前调用的生命周期。setstate并不会立即执行改变state,而是等到render方法执行后再进行改变state的,因此如果在这个周期进行状态变更,是没有任何作用的。(这里的知识点需要对setstate有一定了解)

注:componentWillMount()即将移除

4、render()

render是一个渲染的函数,变动的时机,咱们人长大的过程中,肯定是一个变化的过程的,同等于,react的整个生命周期,render是会多次执行的,不停变化中

5、componentDidMount()

孩子面世的那一刻

这个周期的调用,说明了react已经渲染了组件并且将组件插入DOM中。

所以如果有任何依赖于dom的初始化,可以写在这个周期中。这个方法中使用setState(),可触发重新渲染

以上的方法,除了render,在整个生命周期中,其他方法都只会执行一次~~~

image.png

二、成长中

1、componentwillReceiveProps()

一个人成长过程中,接收到的学习和成长,发生的改变

该方法接收新的props时调用,接收一个新的props为参数,这个参数是state发生更新之后的新值nextProps,在这个方法里,可以用this.props访问当前值,用nextProps访问即将更新的属性值,将新旧值进行计算,确定最后需要更新的状态,最终调用SetState对页面进行更新渲染。

注:componentWillReceiveProps()即将移除

2、shouldComponentUpdate()

成长过程中,面临每一个选择的时候,自身是否要妥协或者坚持。

接收到新的state或者props调用,可以在此去判断,是否继续render,返回值为true则渲染,false为阻止进一步render。

该函数是优化组件性能的重要的一环!!

不能在该函数中调用setState,调用setState会导致再次updateComponent,导致死循环。

3、componentWillUpdate()

注:componentWillUpdate()即将移除

不能在该函数中调用setState,调用setState会导致再次updateComponent,导致死循环。

4、render()

重新触发渲染

5、componentDidUpdate()

经历一次改变成功后
组件更新完成后调用,此时可以获取到dom节点。


image.png

三、准备go die路上

1、componentWillUnmount()

卸载前,销毁组件之前调用该方法

使用该方法清理页面的监听,定时器,断开网络请求等

以上的整个生命周期,每个人都有自己记忆和理解新事物的方法哈,可能有一些描述用词不当,欢迎大家指出来哈~

欢迎来质疑.png

关于componentWillMount、componentWillReceiveProps、componentWillUpdate三个周期即将被移除的问题解答

react v16.3出来之后,去掉了三个原来的生命周期,新增了两个周期函数

去除~

componentWillMount
componentWillReceiveProps
componentWillUpdate

新增~

static getDerivedStateFromProps
getSnapshotBeforeUpdate

取消componentWillMount的原因:
该钩子发生在首次render之前,如果在这个函数中执行初始化数据或者异步请求数据,渲染并不会等待数据返回后去渲染。官方建议数据初始化放在constructor,初始的异步请求放在componetDidMount

取消componentWillReceiveProps的原因:
该钩子是props更新时触发的,如果在componentWillReceiveProps直接调用父组件的某个setstate方法,会导致死循环。

替换成static getDerivedStateFromProps。

class MyComponent extends React.Component{
    static getDerivedStateFromProps(nextProps,prevState){
    //code
    }
}

取消componentWillUpdate的原因:
替换成getSnapshotBeforeUpdate

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

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,410评论 1 33
  • 生命周期流程图简单如下: 组件让你把用户界面分成独立的,可重复使用的部分,并且将每个部分分开考虑。React.Co...
    Simple_Learn阅读 1,067评论 0 0
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 999评论 0 1
  • 说在前面 关于 react 的总结过去半年就一直碎碎念着要搞起来,各(wo)种(tai)原(lan)因(le)。心...
    陈嘻嘻啊阅读 6,840评论 7 41
  • React 生命周期 React生命周期主要包括4个阶段: 初始化阶段 实例化阶段 更新阶段 销毁阶段 1 设置组...
    Android_冯星阅读 623评论 0 1