React中的render何时执行过程


Posted in Javascript onApril 13, 2018

我们都知道Render在组件实例化和存在期时都会被执行。实例化在componentWillMount执行完成后就会被执行,这个没什么好说的。在这里我们主要分析存在期组件更新时的执行。

存在期的方法包含:

  1. - componentWillReceiveProps
  2. - shouldComponentUpdate
  3. - componentWillUpdate
  4. - render
  5. - componentDidUpdate

这些方法会在组件的状态或者属性发生发生变化时被执行,如果我们使用了Redux,那么就只有当属性发生变化时被执行。下面我们将从几个场景来分析属性的变化。

首先我们创建了HelloWorldComponent,代码如下所示:

import * as React from "react";
class HelloWorldComponent extends React.Component {
  constructor(props) {
    super(props);
  }
  componentWillReceiveProps(nextProps) {
    console.log('hello world componentWillReceiveProps');
  }
  render() {
    console.log('hello world render');
    const { onClick, text } = this.props;
    return (
      <button onClick={onClick}>
        {text}
      </button>
    );
  }
}

HelloWorldComponent.propTypes = {
  onClick: React.PropTypes.func,
};

export default HelloWorldComponent;

AppComponent组件的代码如下:

class MyApp extends React.Component {
   constructor(props) {
    super(props);
    this.onClick = this.onClick.bind(this);
  }

  onClick() {
    console.log('button click');
    this.props.addNumber();
  }

  render() {
    return (
      <HelloWorld onClick={this.onClick} text="test"></HelloWorld>
    )
  }
}

const mapStateToProps = (state) => {
  return { count: state.count }
};

const mapDispatchToProps = {
  addNumber
};

export default connect(mapStateToProps, mapDispatchToProps)(MyApp);

这里我们使用了Redux,但是代码就不贴出来了,其中addNumber方法会每次点击时将count加1。

这个时候当我们点击button时,你觉得子组HelloWorldComponent的render方法会被执行吗?

React中的render何时执行过程 

如图所示,当我们点击button时,子组件的render方法被执行了。可是从代码来看,组件绑定的onClick和text都没有发生改变啊,为何组件会更新呢?

如果在子组件的componentWillReceiveProps添加这个log:console.log(‘isEqual', nextProps === this.props); 输出会是true还是false呢?

React中的render何时执行过程 

是的,你没有看错,输出的是false。这也是为什么子组件会更新了,因为属性值发生了变化,并不是说我们绑定在组件上的属性值。每次点击button时会触发state发生变化,进而整个组件重新render了,但这并不是我们想要的,因为这不必要的渲染会极其影响我们应用的性能。

在react中除了继承Component创建组件之外,还有个PureComponent。通过该组件就可以避免这种情况。下面我们对代码做点修改再来看效果。修改如下:

class HelloWorldComponent extends React.PureComponent

这次在点击button时发生了什么呢?

React中的render何时执行过程

虽然componentWillReceiveProps依然会执行,但是这次组件没有重新render。

所以,我们对于无状态组件,我们应该尽量使用PureComponent,需要注意的是PureComponent只关注属性值,也就意味着对象和数组发生了变化是不会触发render的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
tbody元素支持嵌套的注意方法
Mar 24 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 Javascript
jquery中加载图片自适应大小主要实现代码
Aug 23 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
JavaScript实现信用卡校验方法
Apr 07 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
ES6学习教程之模板字符串详解
Oct 09 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
Jan 18 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 Javascript
layui实现checkbox的目录树tree的例子
Sep 12 Javascript
浅析JS中NEW的实现原理及重写
Feb 20 Javascript
全站最详细的Vuex教程
Apr 13 #Javascript
vue的常用组件操作方法应用分析
Apr 13 #Javascript
简单的vuex 的使用案例笔记
Apr 13 #Javascript
angular实现页面打印局部功能的思考与方法
Apr 13 #Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
Apr 13 #Javascript
js捆绑TypeScript声明文件的方法教程
Apr 13 #Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
Apr 13 #Javascript
You might like
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP实现查询两个数组中不同元素的方法
2016/02/23 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
python实现无证书加密解密实例
2014/10/27 Python
python使用webbrowser浏览指定url的方法
2015/04/04 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
python 删除非空文件夹的实例
2018/04/26 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
python IP地址转整数
2020/11/20 Python
python自动化办公操作PPT的实现
2021/02/05 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
phpquery中文手册
2021/03/18 PHP
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
英国知名小木屋定制网站:Tiger Sheds
2020/03/06 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
社会实践心得体会
2014/01/03 职场文书
竞选部长演讲稿
2014/04/26 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android