下图描述了React Native中组件的生命周期:

从上图中可以看到,React Native组件的生命周期可以分为初始化阶段、存在阶段和销毁阶段。

实例化阶段

实例化阶段是React Native组件生命周期的三个阶段中最常用的阶段,该阶段是组件的构建、展示阶段,该阶段中的几个方法的功能解析如下:

getDefaultProps:

该函数用于初始化一些默认的属性。

在组件中可以利用 this.props.* 的方式获取在这个函数中定义的属性。

注意:this.props是只读的区域,组件中不可以修改props中的属性。

getInitialState:

该函数用于对组件的一些状态进行初始化。

可以将控制组件状态的一些变量在这里初始化(通过this.state来获取值,通过this.setState来修改值)。

注意:一旦调用了this.setState方法,组件就一定会调用render函数对组件进行再次渲染,不过React框架会自动根据DOM的状态来判断是否需要真正的渲染。

render:

render函数返回JSX或其他组件来构成DOM(注意:只能返回一个顶级元素)。

在render函数中,只可以通过this.props和this.state来访问在之前的函数中初始化的数据。

componentDidMount:

在调用了render函数,组件加载成功并被成功渲染出来以后,所要执行的后续操作(如网络请求等加载数据的操作),一般会在这个函数中进行。因为UI已经被渲染出来了,所以放在这个函数中进行的请求操作,不会出现UI上的错误。

注意:如果想要在主类中书写多个生命周期函数(getInitialState等),需要使用ES 5的语法,如果使用ES 6的语法会报错。

存在阶段和销毁阶段

当程序执行完了初始化阶段最后调用的componentDidMount函数之后,程序就开始正常的运行起来,此时就进入了存在阶段。

存在阶段执行流程:

程序在运行过程中,如果对this.state或this.props进行了修改,那么就会触发存在阶段的多个函数(调用流程如上图所示)。

无论是修改this.state还是this.props,系统都会调用shouldComponentUpdate函数,判断视图是否需要渲染,如果不需要,则忽略本次状态修改,回到运行状态;如果需要,则在通过componentWillUpdate函数准备之后,重新调用render函数进行渲染。

注意:this.state使用的是状态机机制,即将组件看成一个状态机,一开始有一个初始状态,然后在用户互动的时候改变组件状态,从而触发重新渲染UI。

销毁阶段执行流程:

执行销毁阶段的情况有多种,如:当系统遇到错误而崩溃时;系统空间不足时;APP被用户推出时,等等等等。

当遇到上述问题时,系统就会进入销毁阶段,这个阶段只有一个过程:componentWillUnmount,这个方法用来清空一些无用内容,如:点击事件的Listener等。

注意:销毁阶段是程序执行的出口,只要执行了销毁阶段,就表示程序已经自然或不自然的退出了。

状态机

上面说到,在React Native生命周期初始化阶段的getInitialState方法中用到了状态机的原理,状态机原理即通过修改程序中状态机中的属性的值,来达到改变界面显示的目的。状态机的一段示例代码如下:

var BTouchableDemo = React.createClass({
getInitialState(){
return {
content: '触摸事件响应器'
}
},
render() {
return (
<View style={styles.containerStyle}>
<TouchableOpacity
onPress={() => this.changeResultContent('点击')}
onPressIn={() => this.changeResultContent('按下')}
onPressOut={() => this.changeResultContent('抬起')}
onLongPress={() => this.changeResultContent('长按')}>
<View style={styles.loginContainerStyle}>
<Text style={styles.loginTextStyle}>TouchableOpacity</Text>
</View>
</TouchableOpacity>
<Text style={styles.resultStyle}>{this.state.content}</Text>
</View>
);
},
changeResultContent(content) {
this.setState({
content: content
});
}
});

可以看到,上面一段代码通过修改状态机中的content属性,来修改底部的Text中的文本信息。

注意:如果是要获取状态机中的属性值,则可以直接通过 this.state.* 的方式获取;如果想要设置(更新)状态机中某个属性的值,则必须要通过 this.setState 方法设置。

ES 5和ES 6代码的比较

ES 6的代码风格相对于ES 5有很大的改变,实例化阶段的几个方法(render、getDefaultProps和getInitialState)在ES 5和ES 6的代码差别很大。

使用ES 5的代码编写:

var CLifeCycle = React.createClass({
// 设置一些常量(程序中不可改变的量)
getDefaultProps(){
return {name: 'Jack'};
},
// 设置状态机属性(程序中可以改变的量)
getInitialState(){
return {age: 20};
},
// 渲染布局
render(){
return (
<View style={styles.containerStyle}>
<Text style={styles.textStyle}>我是ES 5语法模板</Text>
</View>
);
}
});

使用ES 6的代码编写:

export default class CLifeCycle extends Component {
// 设置状态机属性(程序中可以改变的量)
constructor(props) {
super(props);
this.state = {age: 20};
} // 渲染布局
render() {
return (
<View style={styles.containerStyle}>
<Text style={styles.textStyle}>我是ES 6语法模板</Text>
</View>
);
}
}
// 设置一些常量(程序中不可改变的量)的数据类型
CLifeCycle.propTypes = {name: React.PropTypes.string};
// 设置一些常量(程序中不可改变的量)的默认值
CLifeCycle.defaultProps = {name: 'Jack'};

获取真实DOM节点

在React Native中,组件并不是真正的DOM节点,而是存在于内存中的一种数据结构,叫做虚拟DOM。只有当它插入文档之后,才会称为真正的DOM。

如果想要通过组件获取真正的DOM节点,可以使用  ref  属性设置标记,然后在需要使用的地方通过  this.refs.*  访问这个组件。

【RN - 基础】之React Native组件的生命周期的更多相关文章

  1. react native组件的生命周期

    react native组件的生命周期 一.当页面第一次加载时,会依次调用: constructor() componentWillMount(): 这个函数调用时机是在组件创建,并初始化了状态之后, ...

  2. Android React Native组件的生命周期及回调函数

    熟悉android的童鞋应该都清楚,android是有生命周期的,其很多组件也是有生命周期.今天小编和大家分享的React Native组件的生命周期,还不了解的童鞋,赶紧来围观吧 在android开 ...

  3. React Native组件、生命周期及属性传值props详解

    创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...

  4. React Native——组件的生命周期

    组件生命周期 上流程图描述了组件从创建.运行到销毁的整个过程,可以看到如果一个组件在被创建,从开始一直到运行会依次调用getDefaultProps到render这五个函数:在运行过程中,如果有属性和 ...

  5. 《React Native 精解与实战》书籍连载「React Native 中的生命周期」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  6. React Native 中 component 生命周期

    React Native 中 component 生命周期 转自 csdn 子墨博客  http://blog.csdn.net/ElinaVampire/article/details/518136 ...

  7. reactjs入门到实战(七)---- React的组件的生命周期

    React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他     getInitia ...

  8. React:组件的生命周期

    在组件的整个生命周期中,随着该组件的props或者state发生改变,其DOM表现也会有相应的变化.一个组件就是一个状态机,对于特定地输入,它总返回一致的输出. 一个React组件的生命周期分为三个部 ...

  9. react教程 — 组件的生命周期 和 执行顺序

    一.组件执行的生命周期:                  参考  https://www.cnblogs.com/soyxiaobi/p/9559117.html  或  https://www.c ...

随机推荐

  1. 文件I/O——文件打开函数(open/openat)

    一.open函数 1.函数原型:int open(const char *path,int oflag,.../* mode_t mode */); 2.头文件:#include <fcntl. ...

  2. 七月月赛T2

    题目描述 “X龙珠”是一款益智小游戏.游戏中有 n(2∣n) 个编号互不相同龙珠按照给定的顺序排成一个队列,每个龙珠上面都有一个编号.每次操作时,选择并取出龙珠队列中相邻的两个龙珠,放到目标队列的末尾 ...

  3. 九:写了一下红帽免费的centos6的安装步骤

    linux centos 6安装方法 前提需要: 1, centos6的镜像文件 2,VMware 提前安装 注:获取镜像 阿里开源系统,此处可下载其他的 1.Ubuntu 2.Susa 3.Cent ...

  4. 002.Kubernetes简单入门实例

    一 环境准备 1.1 基础环境 Kubernetes模式:单机版 系统环境:CentOS 7/172.24.9.157 部署方式:yum快速部署 其他设置:开启NTP.关闭防火墙及SELinux 二 ...

  5. C语言变量名和地址的关系【转载】//基础的东西

    原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...

  6. python中实例方法,类方法,静态方法简单理解

    按照字面名称来理解的话: 实例方法就是实例化对象的方法,绑定在实例对象上 类方法就是类自己的方法,不需要实例化对象,类自己就是对象,直接绑定在类上 静态方法就是普通的函数,函数作为对象,不过是封装在类 ...

  7. wifi各协议最高速率

  8. C语言I博客作业08

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 作业 我在这个课程的目标是 熟悉使用while和do-while结构解决问题 这个作业在那个具体方面帮助我实现目标 pta题目及查找的资料 ...

  9. linux中dd相关命令骚操作

    一.dd如何快速将磁盘写满 方法一: dd if=/dev/zero of=/tmp/file bs=1G count=10 # 参数解释 1. if=文件名:输入文件名,缺省为标准输入.即指定源文件 ...

  10. 关于Prometheus监控的思考:多标签埋点及Mbean

    使用 grafana+prometheus+jmx 作为普通的监控手段,是比较有用的.我之前的文章介绍了相应的实现办法. 但是,按照之前的实现,我们更多的只能是监控 单值型的数据,如请求量,tps 等 ...