一个 React Native 组件从它被 React Native框架加载,到最终被 React Native 框架卸载,会经历一个完整的生命周期。

在这个生命周期中,我们可以定义一些生命周期函数,用来处理在特定条件下React Native组件将要执行的操作,比如在某个时间点读取数据等。

本文将对组件的生命周期做个详细的介绍。

一、组件的生命周期

组件的生命周期一般分为这 4 个阶段:创建阶段、实例化阶段、运行(更新)阶段、销毁阶段。下面对各个阶段分别进行介绍。

1,创建阶段

该阶段主要发生在创建组件类的时候,在这个阶段中会初始化组件的属性类型和默认属性。通常会将固定的内容放在这个过程中进行初始化和赋值。

在 ES6中统一使用 static成员来实现。

static defaultProps = {

autoPlay: false,

maxLoop: 10,

};

2,实例化阶段

该阶段主要发生在实例化组件类的时候,也就是该组件类被调用的时候触发。这个阶段会触发一系列的流程,按执行顺序如下:

constructor:构造函数,这里主要对组件的一些状态进行初始化。

componentWillMount:准备加载组件,可以在这里做一些业务初始化操作,或者设置组件状态。

render:生成页面需要的 DOM结构,并返回该结构。

componentDidMount:组件加载成功并被成功渲染出来后执行。一般会将网络请求等加载数据的操作放在这里进行,保证不会出现 UI上的错误。

3,运行(更新)阶段

该阶段主要发生在用户操作之后或者父组件有更新的时候,此时会根据用户的操作行为进行相应的页面结构的调整。这个阶段也会触发一系列的流程,按执行顺序如下:

componentWillReceiveProps:当组件接收到新的 props时,会触发该函数。在该函数中,通常可以调用this.setState 方法来完成对 state的修改。

shouldComponentUpdate:该方法用来拦截新的 props或 state,然后根据事先设定好的判断逻辑,做出最后要不要更新组件的决定。

componentWillUpdate:当上面的方法拦截返回 true的时候,就可以在该方法中做一些更新之前的操作。

render:根据一系列的 diff算法,生成需要更新的虚拟 DOM数据。(注意:在 render中最好只做数据和模板的组合,不应进行 state等逻辑的修改,这样组件结构会更加清晰)

componentDidUpdate:该方法在组件的更新已经同步到 DOM中去后触发,我们常在该方法中做 DOM操作。

4,销毁阶段

该阶段主要在组件消亡的时候触发。

componentWillUnmount:当组件要被从界面上移除时就会调用。可以在这个函数中做一些相关的清理工作,例如取消计时器、网络请求等。

二、生命周期函数详细介绍

1,constructor

(1)函数原型

constructor(props)

(2)基本介绍

它是组件的构造函数。它的第一个语句必须是 super(props)。

构造函数将在组件被加载前最先调用,并且仅调用一次。

(3)常见用途

构造函数最大的作用,就是在这里定义状态机变量。

2,componentWillMount

(1)函数原型

componentWillMount()

(2)基本介绍

在组件的生命周期中,这个函数只会被执行一次。

这个函数无参数并且不需要任何返回值。

它在初始渲染(render函数被 React Native框架调用执行)前被执行,当它执行完后, render函数会马上被 React Native 框架调用执行。注意:如果在这个函数里调用 setstate函数改变了某些状态机变量的值, React Native 框架不会执行渲染操作,而是等待这个函数执行完成后再执行初始渲染。

如果子组件也有 componentWillMount函数,它会在父组件的 componentWillMount函数之后被调用。

(3)常见用途

如果我们需要从本地存储中读取数据用于显示,那么在这个函数里进行读取是一个很好的时机。

3,render

(1)函数原型

render()

(2)基本介绍

render是一个组件必须有的方法,用于界面渲染。

这个函数无参数,返回 JSX或者其他组件来构成 DOM。注意:只能返回一个顶级元素。

4,componentDidMount

(1)函数原型

componentDidMount()

(2)基本介绍

在组件的生命周期中,这个函数只会被执行一次。

这个函数无参数并且不需要任何返回值。

它在初始渲染执行完成后会马上被调用。在组件生命周期的这个时间点之后,开发者可以通过子组件的引用来访问、操作任何子组件。

如果子组件也有 componentDidMount函数,它会在父组件的 componentDidMount函数之前被调用。

(3)常见用途

如果 React Native 应用需要在程序启动并显示初始界面后从网络侧获取数据,那么把从网络侧获取数据的代码放在这个函数里是一个不错的选择。

5,componentWillReceiveProps

(1)函数原型

componentWillReceiveProps(nextProps)

(2)基本介绍

组件的初始渲染执行完成后,当组件接收到新的 props时,这个函数将被调用。

这个函数不需要返回值。接收一个 object参数, object里是新的 props。

如果新的 props会导致界面重新渲染,这个函数将在渲染前被执行。在这个函数中,老的 props可以通过this.props访问,新的 props在传入的 object中。

如果在这个函数中通过调用 this.setState 函数改变某些状态机变量的值, React Native框架不会执行对这些状态机变量改变的渲染,而是等 componentWillReceiveProps函数执行完成后一起渲染。

注意:

当React Native 初次被渲染时,componentWillReceiveProps函数并不会被触发,这种机制是故意设计的。

6,shouldComponentUpdate

(1)函数原型

boolean shouldComponentUpdate(nextProps, nextState)

(2)基本介绍

组件的初始渲染执行完成后,当组件接收到新的 state或者 props时这个函数将被调用。

该函数接收两个 object参数,其中第一个是新的 props,第二个是新的 state。

该函数需要返回一个布尔值,告诉React Native框架针对这次改变,是否需要重新渲染本组件。默认返回 true。如果此函数返回 false,React Native将不会重新渲染本组件,相应的,该组件的 componentWillUpdate和 componentDidUpdate函数也不会被调用。

(3)常见用途

这个函数常常用来阻止不必要的重新渲染,提高 React Native 应用程序性能。

比如我们可以在该函数中比较新老版本的 state和 props,判断是否需要进行重新渲染。下面是一个简单的使用样例:

shouldComponentUpdate(nextProps, nextState) {

if(this.state.inputedNum.length < 3) return false;

return true;

}

7,componentWillUpdate

(1)函数原型

componentWillUpdate(nextProps, nextState)

(2)基本介绍

组件的初始渲染执行完成后, React Native框架在重新渲染该组件前会调用这个函数。

该函数不需要返回值,接收两个 object参数,其中第一个是新的 props,第二个是新的 state。

我们可以在这个函数中为即将发生的重新渲染做一些准备工作,但不能在这个函数中通过this.setState再次改变状态机变量的值。如果需要改变,则在 componentWillReceiveProps函数中进行改变。

8,componentDidUpdate

(1)函数原型

componentDidUpdate(prevProps, prevState)

(2)基本介绍

组件的初始渲染执行完成后,React Native框架在重新渲染该组件完成后会调用这个函数。

该函数不需要返回值,接收两个 object参数,其中第一个是渲染前的 props,第二个是渲染前的 state。

9,componentWillUnmount

(1)函数原型

componentWillUnmount()

(2)基本介绍

在组件被卸载前,这个函数将被执行。

这个函数没有参数,也没不需要返回值。

(3)常见用途

如果组件申请了某些资源或者订阅了某些消息,那么需要在这个函数中释放资源,取消订阅。

三、完整的样例

下面通过一个简单的文本显示组件,来演示组件各个环节的运作流程。同时这里把组件整个生命周期中所有会触发的方法都列出来了。

import React, { Component } from 'react';

import {

AppRegistry,

StyleSheet,

TextInput,

View,

Text,

Clipboard

} from 'react-native';

export default class Main extends Component {

//构造函数

constructor(props) {

super(props);

console.log("constructor");

//初始化状态值

this.state = {message: "欢迎访问 hangge.com"}

}

//准备加载组件

componentWillMount() {

console.log("componentWillMount");

}

//渲染界面

render() {

console.log("render");

return (

{this.state.message}

);

}

//组件加载成功并渲染出来

componentDidMount() {

console.log("componentDidMount");

}

//组件接收到新的 props 时触发

componentWillReceiveProps(nextProps) {

console.log("componentWillReceiveProps");

}

//决定是否需要更新组件

shouldComponentUpdate(nextProps, nextState) {

console.log("shouldComponentUpdate");

}

//组件重新渲染前会调用

componentWillUpdate(nextProps, nextState) {

console.log("componentWillUpdate");

}

//组件重新渲染后会调用

componentDidUpdate(prevProps, prevState) {

console.log("componentDidUpdate");

}

//组件被卸载前会调用

componentWillUnmount() {

console.log("componentWillUnmount");

}

}

const styles = StyleSheet.create({

container:{

flex:1,

marginTop:40,

alignItems:'center',

},

info:{

fontSize:20,

},

});

AppRegistry.registerComponent('HelloWorld', () => Main);

控制台输出信息如下(由于样例中我没有更新状态,也没有销毁组件。所以也就没有后面两个阶段):

native react 更新机制_React Native - 组件的生命周期详解(附:各阶段调用的方法)...相关推荐

  1. native react 更新机制_React Native 热更新实现(客户端 + 服务器端)

    1. 背景 目前,大家考虑使用React Native 技术的关键点主要有三个: iOS和Android端可以使用统一的语言进行构建,并且部分组件代码可以实现共用 热更新能力,无需发布版本即可实现升级 ...

  2. React 组件的生命周期详解

    2019独角兽企业重金招聘Python工程师标准>>> 概念:在组建的创建.到加载到页面上运行以及组件被销毁的过程中,总是伴随的各种各样的事件,这些在组件特定时期,出触发的事件就叫做 ...

  3. React 深入系列4:组件的生命周期

    文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...

  4. React心得之降龙十八掌:第三式-见龙在田( 组件生命周期详解)

    引言 (乾卦九二)<彖>曰:"'见龙在田',德施普也.""见龙在田,利见大人." 在傅佩荣<自我的觉醒>中这样说道,见龙在田:龙出现在地 ...

  5. 1.react生命周期详解(2020.12.05)

    刚敲完vue的生命周期,现在来敲敲react的生命周期,当然生命周期只针对类组件(我很不常用类组件). raect生命周期(v16之前) initialization(初始化阶段) mounting( ...

  6. react 生命周期详解

    React-ES6 : class App extends React.Component {static get propTypes() {return {//nameProp: PropTypes ...

  7. ES6中的React生命周期详解

    太长时间没写react了,有点生.重新捡起来练练手. import React,{ Component } from 'react';class Demo extends Component {con ...

  8. 【vue3 组件生命周期流程 功能】13个生命周期详解

    内容: 单一组件.父子组件的生命周期. 仅限开发环境下有效的生命周期. 不讲SSR的生命周期:serverPrefetch.也就是只讲客户端的13个生命周期! this的数据:除了`beforeCre ...

  9. native react 更新机制_深度使用react-native的热更新能力,必须知道的一个shell命令...

    开篇之前,先讲一个自己开发中的一个小插曲: 今天周日,iOS版 App 周一提交,周三审核通过上架,很给力.不过,中午11:30的时候,运营就反应某个页面有一个很明显的问题,页面没法拉到底部,部分信息 ...

最新文章

  1. 通过Java执行python文件
  2. axios 登录后设置header_axios如何利用promise无痛刷新token
  3. GPU Pro2 - 3.Procedural Content Generation on the GPU
  4. LeetCode 876. 链表的中间结点(快慢指针)
  5. 2021抖音汽车生态报告
  6. thymeleaf的属性优先级
  7. [转] Gmail 的Host解决方案
  8. TortoiseSVN and TortoiseGit 版本控制图标不见了
  9. html保护眼睛背景色,保护眼睛的颜色和各种背景颜色设置方法
  10. Racecar 基于ROS通信机制的多点导航实验
  11. 三维扫描仪[3]——标定·理论
  12. 2022-03微软漏洞通告
  13. layui日周月年的日历切换,当选择周时设置每周一可选,其余日期置灰不可选
  14. OS学习笔记-6(清华大学慕课) 非连续内存分配管理
  15. 六、字体样式和文本样式
  16. 大学综合测评中,使用VBA代码自动完成EXCEL成绩表
  17. [csh]配置你的csh/tcsh
  18. VS2017设置DLL和LIB的输出目录
  19. 西门子PLC1200学习之PID总结
  20. 2020初网络营销成功案例

热门文章

  1. 【树莓派】给树莓派安装中文输入法Fcitx及Google拼音输入法
  2. 【Python】解决浮点数间运算存在不确定尾数的问题
  3. C#LeetCode刷题之#461-汉明距离​​​​​​​(Hamming Distance)
  4. C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)
  5. Women Don’t Like Questions. Is it True?
  6. mysql开启profiling
  7. python使用md5加密_如何使用Python创建自己的加密货币
  8. 可访问性不一致 可访问性低_什么是网站可访问性?
  9. ubuntu16.04安装docker(阿里云镜像)
  10. Flask框架——请求钩子与request请求对象