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 相关文章推荐
关于html+ashx开发中几个问题的解决方法
Jul 18 Javascript
javascript当中的代码嗅探扩展原生对象和原型(prototype)
Jan 11 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
Mar 12 Javascript
js实现ifram取父窗口URL地址的方法
Feb 09 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
基于javascript实现简单计算器功能
Jan 03 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
Nov 15 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 Javascript
vue 子组件和父组件传值的示例
Sep 11 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开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP 图片水印类代码
2012/08/27 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
用JQuery在网页中实现分隔条功能的代码
2012/08/09 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
Vue绑定内联样式问题
2018/10/17 Javascript
微信小程序实现商城倒计时
2020/11/01 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
jQuery实现简单轮播图效果
2020/12/27 jQuery
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
[01:46]新英雄登场
2019/09/10 DOTA
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
2015/05/06 Python
python比较2个xml内容的方法
2015/05/11 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Django如何实现上传图片功能
2019/08/16 Python
python实现小世界网络生成
2019/11/21 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
逻辑链路控制协议
2016/10/01 面试题
标准化管理实施方案
2014/02/25 职场文书
四风对照检查材料范文
2014/09/27 职场文书
区域销售大会开幕词
2016/03/04 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书
详解Laravel服务容器的优势
2021/05/29 PHP
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS