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读取cookie函数代码
Oct 16 Javascript
AngularJS基础 ng-if 指令用法
Aug 01 Javascript
jQuery源码分析之sizzle选择器详解
Feb 13 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
详解Vue路由自动注入实践
Apr 17 Javascript
layUI实现前端分页和后端分页
Jul 27 Javascript
layui 实现表单和文件上传一起传到后台的例子
Sep 16 Javascript
小程序实现锚点滑动效果
Sep 23 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 Javascript
vue移动端下拉刷新和上滑加载
Oct 27 Javascript
让Vue响应Map或Set的变化操作
Nov 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 CLI模式下的多进程应用分析
2013/06/03 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
小程序实现可拖动的悬浮按钮
2020/09/07 Javascript
swiper自定义分页器的样式
2020/09/14 Javascript
python学生信息管理系统(初级版)
2018/10/17 Python
python实现统计代码行数的小工具
2019/09/19 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
python如何安装下载后的模块
2020/07/03 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
亿企通软件测试面试题
2012/04/10 面试题
电信专业毕业生推荐信
2013/11/18 职场文书
会计找工作求职信范文
2013/12/09 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
2014年变电站工作总结
2014/12/19 职场文书
技术支持岗位职责
2015/02/13 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
python b站视频下载的五种版本
2021/05/27 Python