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 switch case 另类写法
Mar 14 Javascript
dojo学习第一天 Tab选项卡 实现
Aug 28 Javascript
JS获得浏览器版本和操作系统版本的例子
May 13 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
Jun 24 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
Dec 23 Javascript
js实现百度登录框鼠标拖拽效果
Mar 07 Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 Javascript
使用Dropzone.js上传的示例代码
Oct 10 Javascript
Vue.directive()的用法和实例详解
Mar 04 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
简单了解node npm cnpm的具体使用方法
Feb 27 Javascript
详解JS预解析原理
Jun 16 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
PHP中的替代语法简介
2014/08/22 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
javascript父、子页面交互技巧总结
2014/08/08 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
jQuery插件HighCharts实现的2D对数饼图效果示例【附demo源码下载】
2017/03/09 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
更新修改后的Python模块方法
2019/03/03 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
python 控制台单行刷新,多行刷新实例
2020/02/19 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
土木工程师岗位职责
2013/11/24 职场文书
安全资金保障制度
2014/01/23 职场文书
三八节主持词
2014/03/17 职场文书
小学网上祭英烈活动总结
2014/07/05 职场文书
树转促学习心得体会
2014/09/10 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
坎儿井导游词
2015/02/09 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
男人帮观后感
2015/06/18 职场文书
董事长致辞
2015/07/29 职场文书
党校培训学习心得体会
2016/01/06 职场文书
调研报告的主要写法
2019/04/18 职场文书
Python基础教程,Python入门教程(超详细)
2021/06/24 Python