React Native 组件的生命周期

简述

一个对象从开始生成到最后消亡所经历的状态是有一定的顺序的,理解生命周期,是合理开发的关键。RN 组件的生命周期整理如下图(摘自网络):
React Native 生命周期.jpg

如图,可以把组件生命周期大致分为三个阶段:

  • 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,在这里完成了组件的加载和初始化;
  • 第二阶段:是组件在运行和交互阶段,如图中左下角虚线框,这个阶段组件可以处理用户交互,或者接收事件更新界面;
  • 第三阶段:是组件卸载消亡的阶段,如图中右下角的虚线框中,这里做一些组件的清理工作。

下面来详细讲解:

具体方法
之后会有代码示例,供参考

constructor(props, context)

构造函数,在创建组件的时候调用一次,且只调用一次。


void componentWillMount()

在组件挂载之前调用一次。
如果在这个函数里面调用setState,本次的render函数可以看到更新后的state,并且只渲染一次。这个函数在整个生命周期中只被调用一次。


void componentDidMount()

在组件第一次绘制之后,会调用 componentDidMount(),通知组件已经加载完成这个时候,子主键也都挂载好了,可以在这里使用refs。


void componentWillReceiveProps(nextProps)

props是父组件传递给子组件的。父组件发生render的时候子组件就会调用componentWillReceiveProps。
在这个回调函数里面,你可以根据属性的变化,通过调用 this.setState() 来更新你的组件状态,这里调用更新状态是安全的,并不会触发额外的 render() 调用。


bool shouldComponentUpdate(nextProps, nextState)

组件挂载之后,每次调用setState后或接收到新的属性都会调用来判断是否需要重新渲染组件。默认返回true,需要重新render。在比较复杂的应用里,有一些数据的改变并不影响界面展示,可以在这里做判断,优化渲染效率。


void componentWillUpdate(nextProps, nextState)

shouldComponentUpdate返回true或者调用forceUpdate之后,componentWillUpdate会被调用。


void componentDidUpdate()

除了首次render之后调用componentDidMount,其它render结束之后都是调用componentDidUpdate。
componentWillMount、componentDidMount和componentWillUpdate、componentDidUpdate可以对应起来。区别在于,前者只有在挂载的时候会被调用;而后者在以后的每次更新渲染之后都会被调用。


ReactElement render()

render是一个React组件所必不可少的核心函数(上面的其它函数都不是必须的)。记住,不要在render里面修改state。


void componentWillUnmount()

组件被卸载的时候调用。一般在componentDidMount里面注册的事件需要在这里删除。

代码示例

export default class JHReactNative extends Component {
  constructor(props) {
    super(props);
    console.log('=============constructor===========');
    this.state = {};
  }

  // 准备加载组件,会调用
  componentWillMount() {
    console.log('=============componentWillMount===========');
  }

  //在组件第一次绘制之后会调用 ,通知组件已经加载完成
  componentDidMount() {
    //RN 框架是先调用子组件的 componentDidMount(),然后调用父组件的函数
    console.log('=============componentDidMount===========');
  }

  // 如果组件收到新的属性(props),就会调用
  componentWillReceiveProps(nextProps) {
    // 输入参数 nextProps 是即将被设置的属性,
    // 旧的属性还是可以通过 this.props 来获取。
    // 在这个回调函数里面,你可以根据属性的变化,通过调用 this.setState() 来更新你的组件状态,
    // 这里调用更新状态是安全的,并不会触发额外的 render() 调用
    console.log('=============componentWillReceiveProps===========');
  }

  //当组件接收到新的属性和状态改变的话,都会触发调用
  shouldComponentUpdate(nextProps, nextState) {
    console.log('=============shouldComponentUpdate===========');
    return true; //如果 true 表示需要更新,false则不更新,直接进入等待状态
  }

  // 如果组件状态或者属性改变,并且上面的 shouldComponentUpdate(...) 返回为 true,调用
  // 这个函数调用之后,就会把 nextProps 和 nextState 分别设置到 this.props 和 this.state 中
  /*** 不能使用 this.setState 来修改状态***/
  componentWillUpdate(nextProps, nextState) {
    console.log('=============componentWillUpdate===========');
  }

  //渲染界面
  /*** 不能使用 this.setState 来修改状态***/
  render() {
    console.log('=============render===========');
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>Welcome to React Native!</Text>
        <Text style={styles.instructions}>
          Double tap R on your keyboard to reload,{'\n'}
          Shake or press menu button for dev menu
        </Text>
      </View>
    );
  }

  // 调用了 render() 更新完成界面之后,会调用
  componentDidUpdate() {
    /*** 不能使用 this.setState 来修改状态***/
    console.log('=============componentDidUpdate===========');
  }

  // 当组件要被从界面上移除
  componentWillUnmount() {
    /*** 不能使用 this.setState 来修改状态***/
    console.log('=============componentWillUnmount===========');
  }
}

运行结果

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

推荐阅读更多精彩内容