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 相关文章推荐
jQuery对象[0]是什么含义?
Jul 31 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
Aug 22 Javascript
JS获取鼠标相对位置的方法
Sep 20 Javascript
解决VUE中document.body.scrollTop为0的问题
Sep 15 Javascript
Vuex 快速入门(简单易懂)
Sep 20 Javascript
微信小程序非跳转式组件授权登录的方法示例
May 22 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
Aug 20 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 Javascript
vue实现登录拦截
Jun 29 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
Jul 20 Javascript
JavaScript 中的六种循环方法
Jan 06 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完全过滤HTML,JS,CSS等标签
2009/01/16 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
php实现的表单验证类完整示例
2019/08/13 PHP
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
javascript 面向对象编程基础 多态
2009/08/21 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
jQuery仿淘宝网产品品牌隐藏与显示效果
2015/09/01 Javascript
解决js图片加载时出现404的问题
2020/11/30 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
python实现bitmap数据结构详解
2014/02/17 Python
python比较两个列表大小的方法
2015/07/11 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
详解Python if-elif-else知识点
2018/06/11 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python读取与处理netcdf数据方式
2020/02/14 Python
环境科学专业个人求职信
2013/09/26 职场文书
三年级科学教学反思
2014/01/29 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
读书月活动方案
2014/05/22 职场文书
2016年春节问候语
2015/11/11 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python