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 相关文章推荐
JavaScript 异步调用框架 (Part 2 - 用例设计)
Aug 03 Javascript
javascript下string.format函数补充
Aug 24 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
Jun 24 Javascript
24款热门实用的jQuery插件推荐
Dec 24 Javascript
Validform+layer实现漂亮的表单验证特效
Jan 17 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
详解Jquery实现ready和bind事件
Apr 14 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
Oct 12 Javascript
微信小程序自定义底部弹出框
Nov 16 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
Oct 31 Javascript
在vue中动态修改css其中一个属性值操作
Dec 07 Vue.js
全站最详细的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连接MongoDB示例代码
2012/09/06 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP7 其他修改
2021/03/09 PHP
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
JQuery Mobile 弹出式登录框的实现方法
2016/05/28 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
Bootstrap时间选择器datetimepicker和daterangepicker使用实例解析
2016/09/17 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
原生js封装添加class,删除class的实例
2017/11/06 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
python递归计算N!的方法
2015/05/05 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
点球小游戏python脚本
2018/05/22 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
对python中UDP,socket的使用详解
2019/08/22 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
中国旅游网站:途牛旅游网
2019/09/29 全球购物
将相和教学反思
2014/02/04 职场文书
用python删除文件夹中的重复图片(图片去重)
2021/05/12 Python