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图表动画插件Highcharts Examples
Apr 16 Javascript
表单元素的submit()方法和onsubmit事件应用概述
Feb 01 Javascript
用jquery方法操作radio使其默认选项是否
Sep 10 Javascript
js实现获取div坐标的方法
Nov 16 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
浅谈JavaScript 中有关时间对象的方法
Aug 15 Javascript
angular2系列之路由转场动画的示例代码
Nov 09 Javascript
关于vue中 $emit的用法详解
Apr 12 Javascript
解决jquery有正确返回值但不执行success函数的问题
Aug 20 jQuery
bootstrapTable+ajax加载数据 refresh更新数据
Aug 31 Javascript
在vue项目中使用sass语法问题
Jul 18 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中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
又一个php 分页类实现代码
2009/12/03 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
对采用动态原型方式无法展示继承机制得思考
2009/12/04 Javascript
Jquery Ajax学习实例7 Ajax所有过程事件分析示例
2010/03/23 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
浅析jQuery中常用的元素查找方法总结
2013/07/04 Javascript
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
js实现漫天星星效果
2017/01/19 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
VueJs 搭建Axios接口请求工具
2017/11/20 Javascript
React路由管理之React Router总结
2018/05/10 Javascript
快速解决处理后台返回json数据格式的问题
2018/08/07 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
大学生职业生涯规划书模板
2014/01/03 职场文书
优秀公益广告词大全
2014/03/19 职场文书
六一节目主持词
2014/04/01 职场文书
预备党员转正考核材料
2014/06/03 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
人代会简报
2015/07/21 职场文书