[译]React如何区别class和function
译注:
一分钟概览——
React最后采用了在React.Component
上加入isReactComponent
标识作为区分。
1.在这之前,考虑了ES6的区分方法,但是由于Babel的存在,这个方法不可用。
2.总是调用new
,对于一些纯函数组件不适用。而且对箭头函数使用new
会出错。
3.把问题约束到React组件下,通过判定原型链来做,但是可能有多个React实例导致判定出错,所以在原型上添加了标识位,标识位是一个对象,因为早期Jest会忽略普通类型如Boolean型。
4.API检测也是可行的,但是API的发展无法预测,每个检测都会带来额外的损耗,所以不是主要做法,但是在现在版本里已经加入了render
检测,用来检测prototype.render
存在,但是prototype.isReactComponent
不存在的场景,这样会抛出一个warning。
以下正文。
思考一下下面这个使用function定义的Greeting
组件:
function Greeting() {
return Hello;
}
React也支持class定义:
class Greeting extends React.Component {
render() {
return Hello;
}
}
(直到最近,这是唯一可以使用类似state
这种功能的方法。)
当你在使用<Greeting />
组件时,其实并不关心它是怎么定义的。
// Class or function — whatever.
但是React自己是关心这些不同的!
如果Greeting
是一个函数,React需要去调用它:
// Your code
function Greeting() {
return Hello;
}
// Inside React
const result = Greeting(props); // Hello
但是如果Greeting
是类,React就需要用new
关键字去实例化一个对象,然后立刻调用它的render
方法。
// Your code
class Greeting extends React.Component {
render() {
return Hello;
}
}
// Inside React
const instance = new Greeting(props); // Greeting {}
const result = instance.render(); // Hello
React有一个相同的目的——得到一个渲染完毕的node(在这个例子里,<p>Hello</p>
)。但是如果定义Greeting
决定了剩下的步骤。
所以React是如何知道一个组件是类还是函数?
就像我之前的博客,你不需要知道这个东西对于React而言的效果。我同样好几点不了解这些。请不要把这个问题变成一个面试题。事实上,比起React,这篇博客更关注于JavaScript。
这篇博客写给那些富有好奇心的读者,他们想知道为什么React能以一种确定的方式工作。你是这样的人吗?一起深入探讨吧!
这是一段漫长的旅程。这篇博客不会写很多关于React的东西,但是会一掠JavaScript本身的风采,诸如:new
,this
,class
,箭头函数
,prototype
,__proto__
,instanceof
,以及这些东西如何在JavaScript中合作。幸运的是,在你使用React的时候,你不必想太多这些事。
首先,我们需要明白为什么区分函数和类如此重要。注意我们怎么使用new
操作符去调用一个类:
// If Greeting is a function
const result = Greeting(props); // Hello
// If Greeting is a class
const instance = new Greeting(props); // Greeting {}
const result = instance.render(); // Hello
先来对new
操作符做了什么给出一个粗浅的定义。
以前,JavaScript没有类的概念。然而,你也可以用纯函数去描述一种近似于类的模式。具体而言,你可以在调用函数之前,添加new
,就可以使用任何类似于类构造器的函数了。
// Just a function
function Person(name) {
this.name = name;
}
var fred = new Person('Fred'); // ✅ Person {name: 'Fred'}
var george = Person('George'); //
[译]React如何区别class和function的更多相关文章
- vuejs与angularjs以及react的区别?
1.与AngularJS的区别 相同点: 都支持指令:内置指令和自定义指令. 都支持过滤器:内置过滤器和自定义过滤器. 都支持双向数据绑定. 都不支持低端浏览器. 不同点: 1.AngularJS的学 ...
- 为什么React事件处理函数必须使用Function.bind()绑定this?
最近在React官网学习Handling Events这一章时,有一处不是很明白.代码如下: class Toggle extends React.Component { constructor(pr ...
- [译] React 16.3(.0-alpha) 新特性
原文地址:What's new in React 16.3(.0-alpha) 原文作者:Bartosz Szczeciński 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/ ...
- [译]React Context
欢迎各位指导与讨论 : ) 前言 由于笔者英语和技术水平有限,有不足的地方恳请各位指出.我会及时修正的 O(∩_∩)O 当前React版本 15.0.1 时间 2016/4/25 正文 React一个 ...
- [译]React 在服务端渲染的实现
原文地址:Server-Side React Rendering 原文作者:Roger Jin React 在服务端渲染的实现 React是最受欢迎的客户端 JavaScript 框架,但你知道吗(可 ...
- 前端框架 vue 和 react 的区别
前言:最近需要使用 react,以前用过 vue,故来总结两者的区别. 首先React与vue有几点相同之处 1.都使用了Virtual DOM 2.提供了响应式(Reactive)和组件化(Comp ...
- [React] Preventing extra re-rendering with function component by using React.memo and useCallback
Got the idea form this lesson. Not sure whether it is the ncessary, no othere better way to handle i ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- Vue和React的区别,以及如何选择?
简介 React:React是一个用于创建可重用且有吸引力的UI组件的库.它非常适合代表经常变化的数据的组件. Vue:Vue.js是一个开源JavaScript框架,能够开发单页面应用程序.它还可以 ...
随机推荐
- 关于Sychronized和volatile自己总结的一点点理解(草稿)
问答形式列举: 1. 为什么说sychronized能保证可见性 synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中.因 ...
- 编写简单的maven插件
编写一个简单的输出maven的hello world的插件 1.在eclipse中新建一个maven project项目 然后取名HelloPlugin,建立后,pom文件为(注意packaging为 ...
- 不同浏览器下word-wrap,word-break,white-space强制换行和不换行总结
强制换行与强制不换行用到的属性 我们一般控制换行所用到的CSS属性一共有三个:word-wrap; word-break; white-space.这三个属性可以说是专为了文字断行而创造出来的.首先我 ...
- 06_zookeeper原生Java API使用
[Zookeeper构造方法概述] /** * 客户端和zk服务端的连接是一个异步的过程 * 当连接成功后,客户端会收到一个watch通知 * * ZooKeeper(String connectSt ...
- 04_zookeeper的watcher机制
[watcher简述] * zk针对每个节点的操作,都会有一个监督者:watcher * 当监控的某个对象(znode)发生了变化,则出发watcher * zk中的watcher是一次性的,出发后立 ...
- 【小记录】关于dojo中的on事件
今天碰到一个现象,若是一个函数中存在一个on事件(例如点击事件),在该函数连续触发两次之后在去触发里面的on事件,会发现改时间所对应的函数被调用了两次,若父函数被连续触发N次后再取触发on事件,其对应 ...
- C++中精确到小数点后任意位
#include <iostream> #include <iomanip> //用setprecision(n)设置精度,其中n表示精确到小数点后n位 using names ...
- ArcGIS 10.1 如何连接数据库(转载)
ArcGIS 10.1如何连接数据库 最近在使用ArcGIS 10.1的数据库,在使用的过程中发现了跟以往不太一样的地方,在这里将自己的心得和想法跟大家分享一下(使用Postgresql),根据使用过 ...
- Windows ->> FIX: “The security database on the server does not have a computer account for this workstation trust relationship”
前几天在做AlwaysOn实验时遇到搭建活动目录域时某台已经加入AD的机器无法以域管理员账户登录的情况. 报错信息是:The security database on the server does ...
- Going Deeper with Convolutions(Inception v1)笔记
目录 Abstract Introduction First of All Inception Depth Related Work Motivation and High Level Conside ...