React Native组件的生命周期

<h2>一、生命周期流程图</h2>
下面是通过ProcessOn绘制的React Native组件生命周期流程图,可以先大致看一下,有一个初步的概念,下文会详情介绍。

React Native组件生命周期流程图.png

<h2>二、基础巩固</h2>
props
组件的不可变属性,在组件外部赋值,在组件内部使用,当在组件内部props发生变化,组件不会重新渲染。
props是子组件与父组件通信的桥梁。
props是父组件向子组件传递数据的纽带。
ReactNativeActivity向Js传递数据的接收载体。
举个栗子具体说明,假设有父组件ComponentParent和一个子组件Search,代码结构如下。

//父组件
var ComponentParent = React.createClass({
 getInitialState: function () {
   return { data: 5, };
 },
 getSearchValue:function(val){
   this.setState({ }) 
 },
 render: function () {
   return ( 
        <View> 
            <View> 
              <Search getSearchValue = {this.getSearchValue}  configData={this.state.data}></Search>
           </View> 
      </View> 
       ); 
   },
});
//子组件
var Search = React.createClass({
   getInitialState(){
      return { value:"" }
   },
   getDefaultProps: function () { 
      return { configData: 0 }; 
   },
   transferValue: function (val) { 
      this.props.getSearchValue(val); 
   },
   render: function () { 
     return ( 
         <View > 
            <Text>{this.props.configData}</Text>
            <Text  onPress={this.transferValue.bind(this,this.state.value)}>确定</Text> </View> ); 
        },
  });``` 
- 子组件调用父组件的属性,关键代码`{this.props.configData}`可以获取父组件的`{this.state.data}`的值在子组件中使用。而`configData`是`this.props`的一个组成成员,可以随意定义名字及任意多个props的成员。而在`getDefaultProps`方法中可以设置props的默认值。 
- 子组件调用父组件的方法, 同理,在父组件通过` <Search getSearchValue = {this.getSearchValue}> `向子组件中传递可调用的方法。子组件通过`this.props.getSearchValue(val)`来调用方法,并向父组件中的方法传值。 
- 从Activity或者Fragment等Native向Js传值,`this.props`负责接收。

//在Activity中添加如下代码
@Nullable
@Override
protected Bundle getLaunchOptions() {
Bundle opt = new Bundle();
opt.putString("nativeValue","You are Best!!");
return opt;
}```
在index.android.js中去接收从Activity传入nativeValue值 。

var ComponentParent = React.createClass({ 
   getDefaultProps: function () { 
       return { nativeValue:"" }; 
   }, 
   render: function () { 
      return ( 
         <View style={styles.container}> 
            <Text style={styles.welcome}>{this.props.nativeValue}   
            </Text> 
         </View> 
       );
  },
});```

**state**
 组件的可变属性,用来存储组件自身所需要的数据,React会监听组件的state属性的变化,一旦状态变化,就会调用组件的render方法更新UI。
 - 使用代码示例 `{this.transferValue.bind(this,this.state.value)}`
 - 赋值的代码示例 

getValue: function (text) {
var value = text;
this.setState({ value: value });
},```

  • state属性,需要在getInitialState方法中进行初始化。注意任何状态的改变,都会引起render方法的执行,所以不建议在render内部改变state的值,容易造成无限刷新,导致内存溢出。

<h2>三、组件生命周期介绍</h2>
创建阶段
1、 getDefaultProps方法作用于组件类,也就是调用React.createClass()的时候被调用。每次创建组件的时候执行且只执行一次,方式如 Reload JS。
作用用来处理props的默认值。
note:如果在JS文件中定义了一个组件,但是没有使用它,此组件的getDefaultProps也会被调用。组件内部不允许对props进行修改,只能通过调用她的父组件来修改,也就是从父组件向当前组件进行传值,在组件的内部去使用或展示这个值。

实例化阶段
作用于组件的实例,当组件被调用的时候执行
2、getInitialState方法初始化组件的state值,返回值将赋值给this.state。作用相当于自定义控件的构造函数及成员变量初始化。
3、componentWillMount组件开始渲染render之前被调用。所以控件展示之前的逻辑处理,应该在这个函数中实现。作用相当于Fragment生命周期中的onCreate方法。
4、render方法根据State的值,开始渲染,生成一个虚拟的DOM,并返回。组件所需的控件及初始值在这里定义。相当于MVVM开发模式中的Xml资源文件。返回值:null、false、返回View结构
5、componentDidMount方法在最初的render方法调用之后立即调用。在这个方法中,父组件可以访问子组件的任意引用。子组件的componentDidMount方法在父组件的此方法之前调用。网络请求、事件订阅等操作可以在这个方法中调用。作用相同与Fragment生命周期中的onViewCreate方法。以上是创建一个组件,及不更新组件数据的情况下的整个生命周期,

更新阶段
6、componentWillReceiveProps方法接收更新之后的props。如果props没有更新,此方法不调用。
7、shouldComponentUpdate方法当this.state的值有变化时,先执行此方法,此返回值为true/false,判断是否执行更新操作,即是否执行render渲染。所以可以在此方法中编写当状态改变时是否重新渲染的逻辑。
8、componentWillUpdate方法执行更新render方法之前需要做的处理。同componentWillMount方法,可以修改state值。
9、componentDidUpdate方法组件的更新已同步到DOM中,可以进行DOM操作。

销毁阶段
10、componentWillUnMount组件生命周期的最后一步,组件将走到生命的尽头,_,这是我们需要做一些回收的工作。如取消事件绑定,关闭网络连接等操作。以上说全部生命周期的介绍,我们在看一遍流程图,是否有一个新的认识。

React Native组件生命周期流程图.png

总结
1、 组件被创建后,如果不被调用,将只调用getDefaultProps方法。
2、 componentWillMountcomponentWillUpdate方法,是render调用之前最后一个方法,可以用来处理this.state赋值操作及业务逻辑。
3、 因为this.state状态的改变,会重新渲染组件,render方法会执行,所以不要在render中做对this.state值改变操作,只用来展示。 f 否则很有可能造成循环渲染,导致程序崩溃。

相关例子github地址:https://github.com/YongHuiLuo/ComponentLifeCycle

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

推荐阅读更多精彩内容