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 相关文章推荐
prototype与jquery下Ajax实现的差别
Sep 13 Javascript
理解Javascript_09_Function与Object
Oct 16 Javascript
js实现网页标题栏闪烁提示效果实例分析
Nov 20 Javascript
使用jQuery在对象中缓存选择器的简单方法
Jun 30 Javascript
js实现选中页面文字将其分享到新浪微博
Nov 05 Javascript
干货分享:让你分分钟学会javascript闭包
Dec 25 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
Jun 07 Javascript
js实现二级导航功能
Mar 03 Javascript
JavaScript闭包_动力节点Java学院整理
Jun 27 Javascript
vue.js 中使用(...)运算符报错的解决方法
Aug 09 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
Dec 12 Javascript
Postman动态获取返回值过程详解
Jun 30 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与javascript对多项选择的处理
2006/10/09 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
使用正则去除php代码中的注释方法
2016/11/03 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
layer弹出层框架alert与msg详解
2017/03/14 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
python 数据加密代码
2008/12/24 Python
Django中使用group_by的方法
2015/05/26 Python
在Python中使用正则表达式的方法
2015/08/13 Python
浅谈Python 对象内存占用
2016/07/15 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
python SVM 线性分类模型的实现
2019/07/19 Python
python super的使用方法及实例详解
2019/09/25 Python
能否解释一下XSS cookie盗窃是什么意思
2012/06/02 面试题
九年级数学教学反思
2014/02/02 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
勤俭节约主题班会
2015/08/13 职场文书
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
Golang bufio详细讲解
2022/04/21 Golang
Python代码实现双链表
2022/05/25 Python