react组件中的constructor和super小知识

1、react中用class申明的类一些小知识

如上图:类Child是通过class关键字申明,并且继承于类React。

A、Child的类型是?   typeof  Child   ===  'function'  , 其实就相当于ES5用function申明的构造函数    function Child() {  //申明构造函数  }

B、Child类调用时候(  new Child() ),会优先执行,并且自动执行Child的constructor函数

constructor() {
console.log('执行了constructor')
return 'hah'
} getName() {
console.log('执行了方法')
}
}
var dd = new Person();
console.log(dd)

打印如下:

3、Child类中的this?    this指向Child的实例,相当于 new Child()   那么它们完全相等吗?  不是的,react中的this是在new Child()基础上进行了包裹(下图)

上图为new Child()      下图为 Child中的this

结论:this是在new Child()基础上进行了包裹,包含了一些react内部方法,

同时组件中使用Child类(  <div>  <Child /> </div> ),可以看成 new Child() + react包裹。(细节待追究。。。)

2、组件中的constructor是否有必要? 如果没有呢??作用呢???

ES6的知识补充:  http://es6.ruanyifeng.com/#docs/class-extends   如下:

class ColorPoint extends Point {
} // 等同于
class ColorPoint extends Point {
constructor(...args) {
super(...args);
}
}
// 可见没有写constructor,在执行过程中会自动补上

由ES6的继承规则得知,不管子类写不写constructor,在new实例的过程都会给补上constructor。

所以:constructor钩子函数并不是不可缺少的,子组件可以在一些情况略去

接下来,继续看下有没有constructor钩子函数有什么区别:

A、先看有无constructor钩子函数的 this.constructor

有constructor钩子函数的 this.constructor

无constructor钩子函数的 this.constructor

如果能看细节的话,会得知 有constructor钩子函数时候,Child类会多一个constructor方法

B、再看有无先看有无constructor钩子函数的 this,也就是组件实例

有constructor钩子函数的 this实例。

无constructor钩子函数的 this实例。

会得知 有constructor钩子函数时候,可以定义state,如果用户不定义state的话,有无constructor钩子函数时候没有区别

结论: 如果组件要定义自己的state初始状态的话,需要写在constructor钩子函数中,

如果用户不使用state的话,纯用props接受参数,有没有constructor钩子函数都可以,可以不用constructor钩子函数。

再者如果不使用state,那么为什么不使用 无状态组件(建议使用) 呢???

3、super中的props是否必要? 作用是什么??

有的小伙伴每次写组件都会习惯性在constructor和super中写上props,那么这个是必要的吗??

如图:   

首先要明确很重要的一点就是:

可以不写constructor,一旦写了constructor,就必须在此函数中写super(),

此时组件才有自己的this,在组件的全局中都可以使用this关键字,

否则如果只是constructor 而不执行 super() 那么以后的this都是错的!!!

来源ES6 : http://es6.ruanyifeng.com/#docs/class-extends

但是super中必须写参数props吗??   答案是不一定,先看代码:

有props:

无props:

可以得出结论:当想在constructor中使用this.props的时候,super需要加入(props),

此时用props也行,用this.props也行,他俩都是一个东西。(不过props可以是任意参数,this.props是固定写法)

如图:

 如果在custructor生命周期不使用 this.props或者props时候,可以不传入props

下面是一个使用props的场景,此时别忘了 componentWillReceiveProps 生命周期哟

参考另一篇文章  react的生命周期需要知道的

接上:如果constructor中不通过super来接收props,在其他生命周期,

诸如componentWillMount、componentDidMount、render中能直接使用this.props吗??

结论:可以的,react在除了constructor之外的生命周期已经传入了this.props了,完全不受super(props)的影响

所以super中的props是否接收,只能影响constructor生命周期能否使用this.props,其他的生命周期已默认存在this.props

react组件中的constructor和super小知识的更多相关文章

  1. 规避 React 组件中的 bind(this)

    React 组件中处理 onClick 类似事件绑定的时候,是需要显式给处理器绑定上下文(context)的,这一度使代码变得冗余和难看. 请看如下的示例: class App extends Com ...

  2. 【React】282- 在 React 组件中使用 Refs 指南

    英文:Yomi Eluwande  译文:joking_zhang https://segmentfault.com/a/1190000019277029 使用 React 时,我们的默认思维方式应该 ...

  3. 在 React 组件中使用 Refs 指南

    原文:Fullstack React's Guide to using Refs in React Components作者:Yomi Eluwande译者:博轩 译文:https://segment ...

  4. wn-cli 像React组件开发一样来开发微信小程序

    项目地址:wn-cli wn-cli wn-cli 像React组件开发一样来开发微信小程序 名字由来:wn -> weapp native 取第一个字母 Install npm install ...

  5. React组件中的key

    React组件中的key 一.key的作用 react中的key属性,它是一个特殊的属性,它是出现不是给开发者用的(例如你为一个组件设置key之后不能获取组件的这个key props),而是给reac ...

  6. React组件中对子组件children进行加强

    React组件中对子组件children进行加强 问题 如何对组件的children进行加强,如:添加属性.绑定事件,而不是使用<div>{this.props.children}< ...

  7. react组件中刷新组件小技巧

    在开发过程中,经常遇到组件数据无法更新,例如:当你用同一个表格展示不同数据的时候,当点击第5页后,再点击另外一份数据时发现还在第五页,并没有回到第一页. 怎么能让一个组件每次数据不一样时都重新加载呢, ...

  8. 在 React 组件中监听 android 手机物理返回/回退/back键事件

    当前端页面嵌入到 webview 中运行时,有时会需要监听手机的物理返回按键事件来做一些自定义的操作. 比如我最近遇到的,在一个页面里面有批量选择的功能,当点击手机的返回键时,清除页面上的选中状态.我 ...

  9. 优雅的在React组件中注册事件

    前言 在React的开发中,我们经常需要在 window 上注册一些事件, 比如按下 Esc 关闭弹窗, 按上下键选中列表内容等等.比较常见的操作是在组件 mount 的时候去 window 上监听一 ...

随机推荐

  1. Integer包装类源码分析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 今天上班的途中在手机里看到几道关于Integer拆装箱的小题目,正好有点时间翻看了一下Integer类的源码,加上自己的一点思考,决定写点 ...

  2. Javascript模式小记(一)

    js总是可以在不知不觉中地创建了全局变量,其原因在于JavaScript的两个特性. 1.JavaScript可直接使用变量,甚至无需声明: 2.JavaScript有个暗示全局变量的概念,即任何变量 ...

  3. 如何正确的使用Ubuntu以及安装常用的渗透工具集.

    文章来源i春秋 入坑Ubuntu半年多了  记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习.   这里主要来 ...

  4. 请求报错:“应以Content-Type: application/x-www-form-urlencoded为请求类型,在form表单中提交登录信息。"

    竟然是post 方法少了参数 // // 摘要: // 以异步操作将 POST 请求发送给指定 URI. // // 参数: // requestUri: // 请求发送到的 URI. // // c ...

  5. 【2019北京集训3】逻辑 树剖+2-sat

    题目大意:有一颗有$m$个叶子节点的二叉树. 对于叶子节点$i$,$x[i]=(a[i]\ xor\ V_{p[i]})or(b[i]\ xor\ V_{q[i]})$ 对于非叶子节点$i$,$x[i ...

  6. Java Web——过滤器

    <Java Web开发技术应用——过滤器> 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进 ...

  7. Volley Get网络请求

    public class VolleyActivity extends AppCompatActivity { WebView webView; Button button; RequestQueue ...

  8. 软工网络16个人作业2——WordCount

    Deadline: 2018-9-17 22:00PM,以博客提交至班级博客时间为准 要求参考来自:https://www.cnblogs.com/xinz/archive/2011/11/27/22 ...

  9. 整合Spring和SpringMVC

    1.Spring容器和SpringMVC容器的关系 Spring容器是一个父容器,SpringMVC容器是一个子容器,它继承自Spring容器.因此,在SpringMVC容器中,可以访问到Spring ...

  10. SpringMVC教程3

    SpringMVC教程2 一.文件上传 1.引入相关jar包 maven坐标 <!-- fileUpload 解析上传的文件用到的jar --> <dependency> &l ...