React 从入门到进阶之路(九)
之前的文章我们介绍了 React propTypes defaultProps。接下来我们将介绍 React 生命周期函数。
之前我们已经根据 create-react-app 模块创建了一个 React 项目,并定义 App.js 为根组件,即父组件,Home.js 为子组件。我们看一下两个组件的代码:
App.js
import React, {Component} from 'react';
import Home from './components/Home';
class App extends Component {
constructor(props) {
super(props);
this.state = {
title: "我是父组件 App 的 title",
flag: true,
}
}
setFlag = () => {
this.setState({
flag: !this.state.flag
})
}
setTitle = () => {
this.setState({
title: "我是父组件 App 更改后的 title"
})
}
render() {
return (
<div className="App">
{
this.state.flag ? <Home title={this.state.title}/> : ""
}
<hr/>
{/*通过 flag 来控制子组件 Home 的挂载与销毁*/}
<button onClick={this.setFlag}>控制Home组件挂载销毁</button>
<hr/>
{/*通过 flag 来控制子组件 Home 的挂载与销毁*/}
<button onClick={this.setTitle}>修改App组件的title值</button>
</div>
);
}
}
export default App;
Home.js
import React, {Component} from 'react';
class Home extends Component {
constructor(props) {
console.log('01构造函数');
super(props);
this.state = {
name: '我是子组件 Home 的 name',
sex: 1
};
}
//组件将要挂载的时候触发的生命周期函数
componentWillMount() {
console.log('02组件将要挂载');
}
//组件挂载完成的时候触发的生命周期函数
componentDidMount() {
//dom操作放在这个里面,请求数据也放在这个里面
console.log('04组件挂载完成');
}
//是否要更新数据 如果返回true才会执行更新数据的操作
shouldComponentUpdate(nextProps, nextState) {
console.log('01是否要更新数据');
// 父组件传递过来的更改后的值
console.log(nextProps);
// 子组件更改后 this.state 的值
console.log(nextState);
// 如果为 true 则可以更新数据,如果为 false 则不能更新数据
return true;
}
//将要更新数据的时候触发
componentWillUpdate() {
console.log('02组件将要更新');
}
//组件更新完成
componentDidUpdate() {
console.log('04组件数据更新完成');
}
//在父组件里面改变props传值的时候触发的
componentWillReceiveProps() {
console.log('父子组件传值,父组件里面改变了props的值触发的方法')
}
setName = () => {
this.setState({
name: '我是子组件 Home 更改后的 name 值'
})
}
//组件销毁的时候触发的生命周期函数,用在组件销毁的时候执行操作
componentWillUnmount() {
console.log('组件销毁了');
}
render() {
console.log('03数据渲染render');
return (
<div>
{/*父组件 App 传递过来的 title 值*/}
<p>{this.props.title}</p>
<br/><br/>
{/*更改子组件 Home 的 name 值*/}
<button onClick={this.setName}>更新name的数据</button>
</div>
);
}
}
export default Home;
我们在父组件 App 中通过 <Home /> 标签插入子组件 Home,将 this.state 中的 title 值传给 Home 组件,并通过一个 flag 属性来控制该 Home 组件的挂载和销毁,并在 App 组件中定义一个 setTitle 的方法可以改变 this.state 中 title 的值。
我们在子组件 Home 中定义了很多组件的生命周期函数,下面我们来一点点分析。
我们先来看当页面加载时浏览器端的显示:

从控制台的输出结果我们可以看出组件在挂在时经历了四个阶段:
1、constructor:组件在挂载前最先经历该阶段,初始化数据。
2、componentWillMount,组件将要挂载时触发的生命周期函数。
3、render:数据渲染 render
4、componentDidMount:组件挂载完成时触发的生命周期函数。我们可以将 DOM 操作和请求数据放在这里面。
当我们点击 更新name的数据 的 button 按钮时,将 this.state 中的 name 值进行更改,浏览器的显示如下:

从控制台的输出结果我们可以看出组件在挂在时经历了四个阶段:
1、shouldComponentUpdate:是否需要更新数据,在该生命周期函数中如果 return true,则表示可以更新数据,如果 return false,则表示不允许更新数据,当更新数据时是不成功的。同时该生命周期函数中有两个传参 nextProps,nextState,其中 nextProps 表示父组件传递过来的值更改后的值,这个我们在下面的例子中解释。nextState 表示子组件更改后子组件中 this.state 的数据,从控制台的打印结果可以看出 this.state 中 name 值已经变成了更改后的值。
2、componentWillUpdate,将要更新数据的时候触发的生命周期函数。
3、render:数据渲染 render
4、componentDidUpdate:组件更新完成时触发的生命周期函数。
当我们点击 修改App组件的title值 的 button 按钮时,该 button 是父组件 App 的的一个按钮,将 App 组件中 this.state 的 title 值进行更改,浏览器的显示如下:

从控制台的输出结果我们可以看出组件在挂在时经历了五个阶段:
1、shouldWillReceiveProps:在父组件里面改变 props 传值的时候触发。
2、shouldComponentUpdate:是否需要更新数据,在该生命周期函数中如果 return true,则表示可以更新数据,如果 return false,则表示不允许更新数据,当更新数据时是不成功的。同时该生命周期函数中有两个传参 nextProps,nextState,其中 nextProps 表示父组件传递过来的值更改后的值,从控制台的打印结果可以看出 App 组件 this.state 中 title 值已经变成了更改后的值。nextState 表示子组件更改后子组件中 this.state 的数据,。
3、componentWillUpdate,将要更新数据的时候触发的生命周期函数。
4、render:数据渲染 render
5、componentDidUpdate:组件更新完成时触发的生命周期函数。
当我们点击 控制Home组件挂载销毁 的 button 按钮时,该 button 是父组件 App 的的一个按钮,当 App 组件的 this.state 中 flag 为 true 时 Home 组件挂载,当 flag 为 false 时 Home 组件销毁,浏览器的显示如下:

从控制台的输出结果我们可以看出组件在挂在时经历了一个阶段:
1、shouldWillUnmount:组件销毁的时候触发的生命周期函数。
当我们再次点击 控制Home组件挂载销毁 的 button 按钮时,组件又重新挂载,就会再在执行组件挂载时的生命周期函数,最后效果如下:

React 从入门到进阶之路(九)的更多相关文章
- React 从入门到进阶之路(四)
之前的文章我们介绍了 React 绑定属性( 绑定class 绑定style).引入图片 循环数组渲染数据.接下来我们将介绍 React 事件,方法, React定义方法的几种方式 获取数据 改 ...
- React 从入门到进阶之路(三)
之前的文章我们介绍了 React 创建组件.JSX 语法.绑定数据和绑定对象.接下来我们将介绍 React 绑定属性( 绑定class 绑定style).引入图片 循环数组渲染数据. 上一篇中我们 ...
- React 从入门到进阶之路(五)
之前的文章我们介绍了 React 事件,方法, React定义方法的几种方式 获取数据 改变数据 执行方法传值.接下来我们将介绍 React 表单事件 键盘事件 事件对象以及 React中 的 re ...
- React 从入门到进阶之路(七)
之前的文章我们介绍了 React 表单详解 约束性和非约束性组件 input text checkbox radio select textarea 以及获取表单的内容.接下来我们将介绍 Rea ...
- React 从入门到进阶之路(六)
之前的文章我们介绍了 React 表单事件 键盘事件 事件对象以及 React中 的 ref 获取 dom 节点 .双向数据绑定.接下来我们将介绍 React 表单详解 约束性和非约束性组件 inpu ...
- React 从入门到进阶之路(八)
之前的文章我们介绍了 React中的组件.父子组件.React props父组件给子组件传值.子组件给父组件传值.父组件中通过refs获取子组件属性和方法.接下来我们将介绍 React propTyp ...
- React 从入门到进阶之路(二)
在之前的文章中我们介绍了 React 开发的环境搭建及目录介绍和整理,本篇文章将介绍 React 创建组件.JSX 语法.绑定数据和绑定对象. 之前我们已经将项目运行了起来,我们再来看一下目录结构: ...
- React 从入门到进阶之路(一)
在开始 React 学习之前我们先进入官网 https://react.docschina.org/ 看看官方对 React 的解释:React 是用于构建用户界面的JavaScript 库.我们只需 ...
- Python 爬虫从入门到进阶之路(九)
之前的文章我们介绍了一下 Python 中的正则表达式和与爬虫正则相关的 re 模块,本章我们就利用正则表达式和 re 模块来做一个案例,爬取<糗事百科>的糗事并存储到本地. 我们要爬取的 ...
随机推荐
- 如何用Python批量发现互联网“开放”摄像头
现在无论家用还是公司使用摄像头越来越多,但是安全性又如何呐?今天我来说说几款比较常用的摄像头,并且使用python如何批量检查弱口令. 第一个“海康威视”: 前段时间爆出海康威视的摄像头存在默认弱口令 ...
- nginx匹配规则
rewrite ^/(.*)$ /index.php/$1 last; 这句话的意思,是把slash(/)之后的所有内容在前面加上一个/index.php,这里的$1指代前面括号的正则表达式(.*)所 ...
- 30 分钟编写一个 Flask 应用
Flask 是一种很赞的Python web框架.它极小,简单,最棒的是它很容易学. 今天我来带你搭建你的第一个Flask web应用!和官方教程 一样,你将搭建你自己的微博客系统:Flaskr.和官 ...
- RBtree插入跟删除图解代码
一.红黑树的简单介绍 RBT 红黑树是一种平衡的二叉查找树.是一种计算机科学中经常使用的数据结构,最典型的应用是实现数据的关联,比如map等数据结构的实现. 红黑树有下面限制: 1. 节 ...
- Linux系统调用(syscall)原理(转)
引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及app.framework.native一直到kernel,可能迷失到代码世界,明白了系统调用原理,或许能帮你峰回路转,找到 ...
- SQL获取事件探查器保存的跟踪文件
fn_trace_gettable (Transact-SQL) 以表格格式返回一或多个跟踪文件的内容. Transact-SQL 语法约定 语法 fn_trace_gettable ( filena ...
- AOP是怎么实现的,有几种方式
1.静态AOP:在编译期,切面直接以字节 码的形式编译到目标字节 码文件中. AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器. 优点 ...
- 杭电(hdu)1181 变形课
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submi ...
- 从小姐姐博客那里看到的流光文字(CSS3 animate)
对于流光文字,大家并不陌生,毕竟我们都经历过非主流的时代.你们卟懂绯紸流!色彩缤纷的QQ空间...... 还记得那些炫酷的签名档,或者那些炫酷的动态头像.不过大家对于流光文字的印象还是图片.那么在网页 ...
- Hadoop 中的 (side data) 边数据
一.用途 边数据是作业所需的额外的只读数据,通常用来辅助主数据集: 二.方法 1.利用Configuration类来配置,利用setter()和getter()可方便的使用,方便存储一些基本的类型: ...