下图描述了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. Python 中用面向对象的思想处理网页翻页 (初级)

    第一种处理方法: class Pagenation(object): """ 处理分页相关的代码 """ def __init__(self ...

  2. leetcode算法小题(2)

    题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. package Simple;import java.util.Scanner;public class Prac ...

  3. ubuntu 制作本地yum仓库

    ubuntu 制作本地yum仓库 笔者: 张首富 W X: y18163201(请备注) qq群:895291458 时间:2019-01-31晚 今天到某银行进行软件部署的时候,碰到所有电脑都不允许 ...

  4. 创建WebApi

    一.创建 Web 项目 使用vs创建项目,选择“ASP.NET Core Web 应用程序”模板,将项目命名为 TodoApi,然后单击“确定”. 在“新建 ASP.NET Core Web 应用程序 ...

  5. 搭建邮件服务器,使用Postfix与Dovecot收发电子邮件

    小知识: 我们为什么要搭建邮件服务器呢?有时候我们处于一个局域网内,不能及时的分享各自的研究成果,迫切的需要一种能够借助于网络且建立在计算机之间的传输数据的方法.所以我们需要搭建邮件服务器,这样的话既 ...

  6. Django学习day6——模板

    在day4中,你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python 代码之中. html = "<html><body& ...

  7. Codeforces 1183F - Topforces Strikes Back

    Div. 3的题,竟然卡了好久,自闭.jpg 好像我的思路不太一样呢QAQ 首先注意到,如果一个数是另一个的因子,那它肯定不会出现在答案中. 我们先把所有数排序,然后对每个数,我们要往前再找两个数(或 ...

  8. 智和网管平台SugarNMS助力网络安全运维等保2.0建设

    智和信通智和网管平台SugarNMS结合<信息安全技术 网络安全等级保护基本要求>(GB/T 22239-2019)等国家标准文件以及用户提出的网络安全管理需求进行产品设计,推出“监控+展 ...

  9. python机器学习——感知器

    最近在看机器学习相关的书籍,顺便把每天阅读的部分写出来和大家分享,共同学习探讨一起进步!作为机器学习的第一篇博客,我准备从感知器开始,之后会慢慢更新其他内容. 在实现感知器算法前,我们需要先了解一下神 ...

  10. 文件输入输出函数fgetc/fputc及fgets/fputs等文件指针位置的变化

    文件打开后才可以对文件进行操作.也就是说,文件必须经历打开-操作-关闭的过程.如前所述,C语言对文件的操作都是通过调用标准I/O库函数来实现的.文件操作实际是指对文件的读写.文件的读操作就是从文件中读 ...