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对象的函数
Dec 22 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
May 26 Javascript
能说明你的Javascript技术很烂的五个原因分析
Oct 28 Javascript
用jquery存取照片的具体实现方法
Jun 30 Javascript
js判断浏览器类型的方法
Aug 07 Javascript
JS分页效果示例
Oct 11 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
基于JavaScript中字符串的match与replace方法(详解)
Dec 04 Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 Javascript
详解vue高级特性
Jun 09 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获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
原生js仿浏览器滚动条效果
2017/03/02 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
浅谈flask源码之请求过程
2018/07/26 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
jupyter note 实现将数据保存为word
2020/04/14 Python
Python devel安装失败问题解决方案
2020/06/09 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
风险评估实施方案
2014/03/09 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
少儿节目主持串词
2014/04/02 职场文书
运动会拉拉队口号
2014/06/09 职场文书
拉歌口号大全
2014/06/13 职场文书
2014年路政工作总结
2014/12/10 职场文书
实习推荐信格式模板
2015/03/27 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers
Python字典和列表性能之间的比较
2021/06/07 Python
Python进程池与进程锁之语法学习
2022/04/11 Python