React-Native之生命周期函数

概述

不管是iOS还是Android开发,都离不开'生命周期'这一说。所谓的生命周期指的就是:程序从开始运行直至程序退出结束的这么一个过程。在这个过程中所触发的一些函数方法,就成为生命周期函数。理解生命周期,这是每一个开发者都所必须掌握的知识。学习RN也不例外。

LifeCycle.jpg

  • 生命周期可以分为三个阶段:
    • 初始化阶段(红色部分):在这里完成组件的第一次加载和初始化工作。
    • 运行阶段(蓝色部分):这个阶段组件可以处理交互和界面更新的一些事情。
    • 销毁阶段(绿色部分):这个阶段是销毁组件,回收内存空间。
初始化阶段
  • getDefaultProps
    在组件创建之前调用。一般在该方法中定义一些全局的常量。注意:如果父组件传递过来的Props和你在该函数中定义的Props的key一样,将会被覆盖。

    • ES6写法
      // 在方法外面定义props常量
      Demo.defaultProps = {name : '常量'}
      
      export default class Demo extends Component {      
       render() {
          return (
                <View style={styles.container}>
                      <Text> {this.props.name} </Text>
                </View>
          );
       }
      }
      
  • getInitialState
    初始化组件的时候被调用。一般在该函数中定义一些全局的变量。

    • 这是ES5的写法,ES6写法是在构造函数 constructor(props) 初始化 state,然后在需要修改的时候调用 setState。
      export default class Demo extends Component {      
          // 在这里定义变量
          constructor(props) {
            super(props)
            this.state = { name : '变量', }
          }
      
         render() {
            return (
                  <View style={styles.container}>
                        <Text onPress = {this.renderRename()}
                        > {this.state.name} </Text>
                  </View>
            );
         }
      
         renderRename() {
             // 修改变量
             this.setState(
                 name : '哈哈',
             )
         }
      }
      
  • componentWillMount
    组件即将加载的时候被调用。这个函数调用时机是在组件创建,并初始化了状态之后,在第一次绘制 render() 之前。可以在这里做一些业务初始化操作,也可以设置组件状态。这个函数在整个生命周期中只被调用一次。

  • render
    组件渲染函数,会返回一个Virtual DOM,只允许返回一个最外层容器组件。render函数尽量保持纯净,只渲染组件。

  • componentDidMount
    组件已经加载完成。这个函数调用的时候,其虚拟 DOM 已经构建完成,你可以在这个函数开始获取其中的元素或者子组件了。需要注意的是,RN 框架是先调用子组件的 componentDidMount(),然后调用父组件的函数。从这个函数开始,就可以和 JS 其他框架交互了,例如设置计时 setTimeout 或者 setInterval,或者发起网络请求。这个函数也是只被调用一次。这个函数之后,就进入了稳定运行状态,等待事件触发。一般在该函数中处理一些复杂耗时的操作。

运行阶段
  • componentWillReceiveProps(nextProps)
    props改变(父容器来更改或是redux),将会调用该函数。新的props将会作为参数传递进来,老的props可以根据this.props来获取。输入参数 nextProps 是即将被设置的属性,旧的属性还是可以通过 this.props 来获取。在这个回调函数里面调用 this.setState() 来更新你的组件状态,并不会额外触发 render() 调用。

  • shouldComponentUpdate(object nextProps, object nextState)
    当组件接收到新的属性和状态改变的话,都会触发调用。输入参数nextProps 是即将被设置的属性,nextState 表示组件即将更新的状态值。这个函数的返回值决定是否需要更新组件,如果 true 表示需要更新,继续走后面的更新流程。否者,则不更新,直接进入等待状态。在某些特定条件下,我们可以根据传递过来的props和state来选择更新或者不更新,从而提高效率。

  • componentWillUpdate(object nextProps, object nextState)
    如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(...) 返回为 true,就会开始准更新组件,并开始被调用。 输入参数与 shouldComponentUpdate 一样,在这个回调中,可以做一些在更新界面之前要做的事情。需要特别注意的是,在这个函数里面,你就不能使用 this.setState 来修改状态。这个函数调用之后,就会把 nextProps 和 nextState 分别设置到 this.props 和 this.state 中。紧接着这个函数,就会调用 render() 来更新界面了。

  • componentDidUpdate(object prevProps,object prevState)
    组件更新之后被调用。

销毁阶段
  • componentWillUnmount()
    该函数中主要是做一些组件的销毁或清理操作。
props 和 state
  • 相同点:

    1.不管是props还是state发生改变,都会调用render()重新渲染。
    2.都可以设定初始值。
    
  • 不同点

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

推荐阅读更多精彩内容