实例讲解React 组件生命周期


Posted in Javascript onJuly 08, 2020

在本章节中我们将讨论 React 组件的生命周期。

组件的生命周期可分成三个状态:

  • Mounting:已插入真实 DOM
  • Updating:正在被重新渲染
  • Unmounting:已移出真实 DOM

生命周期的方法有:

  • componentWillMount 在渲染前调用,在客户端也在服务端。
  • componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异步操作阻塞UI)。
  • componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。
  • shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。可以在你确认不需要更新组件时使用。
  • componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
  • componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。
  • componentWillUnmount在组件从 DOM 中移除之前立刻被调用。

这些方法的详细说明,可以参考官方文档。

实例

以下实例在 Hello 组件加载以后,通过 componentDidMount 方法设置一个定时器,每隔100毫秒重新设置组件的透明度,并重新渲染:

class Hello extends React.Component {
 
 constructor(props) {
   super(props);
   this.state = {opacity: 1.0};
 }
 
 componentDidMount() {
  this.timer = setInterval(function () {
   var opacity = this.state.opacity;
   opacity -= .05;
   if (opacity < 0.1) {
    opacity = 1.0;
   }
   this.setState({
    opacity: opacity
   });
  }.bind(this), 100);
 }
 
 render () {
  return (
   <div style={{opacity: this.state.opacity}}>
    Hello {this.props.name}
   </div>
  );
 }
}
 
ReactDOM.render(
 <Hello name="world"/>,
 document.body
);

运行结果

实例讲解React 组件生命周期

以下实例初始化 state , setNewnumber 用于更新 state。所有生命周期在 Content 组件中。

class Button extends React.Component {
 constructor(props) {
   super(props);
   this.state = {data: 0};
   this.setNewNumber = this.setNewNumber.bind(this);
 }
 
 setNewNumber() {
  this.setState({data: this.state.data + 1})
 }
 render() {
   return (
     <div>
      <button onClick = {this.setNewNumber}>INCREMENT</button>
      <Content myNumber = {this.state.data}></Content>
     </div>
   );
  }
}
 
 
class Content extends React.Component {
 componentWillMount() {
   console.log('Component WILL MOUNT!')
 }
 componentDidMount() {
    console.log('Component DID MOUNT!')
 }
 componentWillReceiveProps(newProps) {
    console.log('Component WILL RECEIVE PROPS!')
 }
 shouldComponentUpdate(newProps, newState) {
    return true;
 }
 componentWillUpdate(nextProps, nextState) {
    console.log('Component WILL UPDATE!');
 }
 componentDidUpdate(prevProps, prevState) {
    console.log('Component DID UPDATE!')
 }
 componentWillUnmount() {
     console.log('Component WILL UNMOUNT!')
 }
 
  render() {
   return (
    <div>
     <h3>{this.props.myNumber}</h3>
    </div>
   );
  }
}
ReactDOM.render(
  <div>
   <Button />
  </div>,
 document.getElementById('example')
);

运行结果

实例讲解React 组件生命周期

以上就是实例讲解React 组件生命周期的详细内容,更多关于React 组件生命周期的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JavaScript是否可实现多线程  深入理解JavaScript定时机制
Dec 22 Javascript
JavaScript DOM 学习第五章 表单简介
Feb 19 Javascript
jquery与prototype框架的详细对比
Nov 21 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
May 05 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
javascript自执行函数
Feb 10 Javascript
基于vue.js中事件修饰符.self的用法(详解)
Feb 23 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
Jul 15 Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
Jun 19 Javascript
详细分析React 表单与事件
Jul 08 #Javascript
详解JavaScript之ES5的继承
Jul 08 #Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 #jQuery
微信小程序拖拽排序列表的示例代码
Jul 08 #Javascript
基于javascript canvas实现五子棋游戏
Jul 08 #Javascript
深度解读vue-resize的具体用法
Jul 08 #Javascript
详解React 条件渲染
Jul 08 #Javascript
You might like
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
JavaScript模板入门介绍
2012/09/26 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
js面向对象编程总结
2017/02/16 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
axios如何利用promise无痛刷新token的实现方法
2019/08/27 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
Python绘制热力图示例
2019/09/27 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
学生个人的自我评价分享
2013/11/05 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
幼儿园开学家长寄语
2014/01/19 职场文书
干部对照检查材料范文
2014/08/26 职场文书
买房子个人收入证明
2014/10/12 职场文书
Python Socket编程详解
2021/04/25 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
python中mongodb包操作数据库
2022/04/19 Python