下图描述了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. 在移动硬盘中安装win10和macos双系统

    本文通过在SSD移动硬盘中安装win10和macos双系统,实现操作系统随身携带 小慢哥的原创文章,欢迎转载 目录 ▪ 目标 ▪ 准备工作 ▪ Step1. 清空分区,转换为GPT ▪ Step2. ...

  2. 一位年轻而优秀的.NET开发者的成长点滴

    一,社区的小圈子 今年3月的一次技术交流活动上,那是我们.NET技术社区第一次组织线下活动,由于没什么经验,所以活动组织得比较仓促,内容也比较一般,效果还是有点欠缺.当然,活动本身是必要的,这次活动上 ...

  3. [loj2546][JSOI2018]潜入行动(树形DP)

    题目描述 外星人又双叒叕要攻打地球了,外星母舰已经向地球航行!这一次,JYY 已经联系好了黄金舰队,打算联合所有 JSOIer 抵御外星人的进攻. 在黄金舰队就位之前,JYY 打算事先了解外星人的进攻 ...

  4. Mybatis:CRUD操作

    提示: Mapper配置文件的命名空间为对应接口包名+接口名字,这个经常会忘记和搞错的!! select标签 在接口中编写三个查询方法 //获取全部用户List<User> selectU ...

  5. [考试反思]1002csp-s模拟测试57:平庸

    一天两场,感觉要完. 不粘排行榜,太壮观了. #1:190 #2:180 #4:160 #35:150 #37:140 #39:120 #kx:20呃... 最后一个是考试结束后了. 又是CE盖40分 ...

  6. CSS尺寸样式属性

    尺寸样式属性介绍 属性 值 含义 height auto:自动,浏览器会自动计算高度length:使用px定义高度%:基于包含它的块级对象的百分比高度 设置元素高度 width 同上 设置元素的宽度 ...

  7. Abp vNext 自定义 Ef Core 仓储引发异常

    问题 在使用自定义 Ef Core 仓储和 ABP vNext 注入的默认仓储时,通过两个 Repository 进行 Join 操作,提示 Cannot use multiple DbContext ...

  8. Resource Path Location Type Target runtime Apache Tomcat v6.0 is not defined(项目报错)已解决

    我换了开发工具后,导入的项目不是这里报错就是那里不错.不过,我喜欢.在tomcat里面部署项目后,定位到报错行时,总是提示我这句话:Description Resource Path Location ...

  9. 提交代码到github托管

    廖雪峰官网:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000,感觉初学很棒的一个地 ...

  10. [LC]35题 Search Insert Position (搜索插入位置)

    ①英文题目 Given a sorted array and a target value, return the index if the target is found. If not, retu ...