React组件实例化
React组件是一个小型的、可重用的代码,负责渲染HTML。在React中,我们可以将一个组件定义为一个类或一个函数。
为了定义一个React组件,我们将创建一个组件并扩展React.component 类。例如,要创建一个教室组件,教室组件应该有教室的详细信息。
在本教程中,我们将主要讨论JJSX。JSX元素可以用HTML格式写,也可以写成一个组件实例。在JJSX中,你用大写字母来区分类似HTML和组件实例。
前提条件
为了有效理解本教程,读者需要具备以下条件。
- 对React库的基本了解。
- 一个合适的IDE,如VS Code。
- 对JSX的基本了解。
主要收获
- 什么是组件实例化?
- 如何实例化一个React组件
- JSX元素中类似HTML和组件实例之间的区别
- 新关键词的含义以及它在React中的使用方法
- React组件实例化
实例化React组件
让我们从导入React库开始。
import React from 'react';
我们导入React是因为JSX将被转换为普通的JavaScript,使用React的React.createElement 方法。因此,在使用JSX时,我们需要导入React。
在导入React库后,我们将导入ReactDOM 。如果你没有使用ES6,在你的IDE中安装react-dom ,使用。
npm install react-dom
但由于我们将使用ES6,我们将使用下面的代码导入ReactDOM 。
import ReactDOM from 'react-dom';
ReactDOM 对于渲染JSX元素和反应组件到 ,这是非常重要的。 代表你的应用程序的整个用户界面。DOM DOM
让我们来创建一个组件类。我们将子类化React.Component 来创建我们的组件类。我们将通过使用以下语法来实现。class V extends React.Component {}.这就是ES6创建一个有状态组件的方法。
现在我们将在我们的代码中加入render() 函数。
class V extends React.Component {
render() {}
}
在我们的应用程序中,render() 函数的动机是使React在我们的网页上渲染HTML。对于一个render() 函数来说,必须有一个return 语句。如图所示,render() 函数中的return 语句会返回一个 JSX 表达式。
class V extends React.Component {
render() {
return <h1>Welcome to React world</h1>;
}
}
像HTML和JSX元素中的组件实例之间的区别是,要制作一个React组件,不要像下面所示的那样用<P> </p>,<h1> </h1> 或<div> </div> 等标签来命名你的JSX元素,而是给它起一个和组件类一样的名字。
ReactDOM.render(
<h1>Welcome to React World</h1>,
document.getElementById('root')
);
例如,我们通过在代码下面添加将是我们组件的类来创建一个组件实例,如下图所示。
import React from 'react';
import ReactDOM from 'react-dom';
class Valley extends React.Component {
render() {
return <h1>Welcome to React world</h1>;
}
}
<Valley />
在创建了一个组件实例后,代码是这样的。这就是你的组件实例了!当类Valley 作为参数传入ReactDOM.render() ,它就被实例化了。
现在我们来渲染我们的组件。
ReactDOM.render(
<Valley />,
document.getElementById('app')
);
当ReactDOM.render() 告诉我们的组件类<Valley /> 调用其render() 方法时,render() 方法被调用。
然后类<Valley /> 调用它的render() 方法,该方法返回JSX元素<h1>Welcome to React World</h1> 。这将使 "欢迎来到React世界 "的信息显示在屏幕上。
使用一个新的关键字
new 关键字创建一个空白的、简单的JavaScript项目。它的语法是new constructor[([arguments])] 。
当你创建一个对象时,会创建一个类实例。要实例化的类名是由构造函数名提供的。
构造函数初始化了新的对象。一个引用被返回到由new 操作符创建的对象。
new 关键字使this 关键字指向新创建的对象,每次提到this 关键字时。
new 关键字执行构造函数,使用新创建的对象。因此,新创建的对象被返回。
实例化函数组件
函数组件是简单的JavaScript组件。它们不使用render() 方法。相反,它们负责渲染用户界面。
它们也接受和使用props。一个函数组件被认为是一个 "转储",因为它只是接受数据。
例子
function Student (marks) {
this.marks = marks;
}
const study = new Student(50);
console.log(study);
上面的代码输出学生的分数。这是因为JS引擎会看到new 关键字,创建一个新的对象并将原型设置为Student.prototype 。
如果一个属性在被请求的新对象中未被定义,脚本将检查[Prototype] 对象中的属性。对象的原型属性是不可见的,因此我们将添加Object.getPrototypeOf(obj) 方法来访问原型对象。
让我们添加console.log(Object.getPrototypeOf(study) === Student.prototype) 来查看study 的原型是否是Student ,这将输出真。
如果我们添加Student ,而不是study ,如图所示console.log(Object.getPrototypeOf(Student) === Student.prototype) ,它将输出错误,因为Student不是Student的原型。
在上面的代码中会发生什么?
const study是指。变量声明需要内存。- 赋值运算符
=意味着:this变量将用赋值运算符=后的表达式进行初始化。 - 表达式
new Student(50):一个新的对象被创建,原型被设置为 student.prototype。 - 分数被分配给新创建的
study对象。 - 新创建的对象被返回并被分配到变量
study。
实例化类组件
类是一个蓝图,可以帮助你定义类似对象之间的共享结构和行为。
类组件实现了逻辑和状态,因此它们被视为 "智能"。道具被传递给类组件,并通过this.props 。
在下面的代码中,开发者类定义了一个构造函数。开发者类期望有一个名字参数,它使用this 关键字在实例上存储这个值。
new 关键字生成了一个新的对象。因此,dev1 作为新对象被返回,因此它输出Tom 作为我们的新开发者。
class Developer {
constructor() {
this.name = 'Tom';
}
}
// class instantiation
const dev1 = new Developer();
console.log(dev1.name);
// expected output: "Tom"
一个Student 类在我们的代码中扩展了Human 类。两个类都定义了一个constructor() 函数。每个学生也是一个Human 。Human 类期望得到名字参数,该值使用this 关键字存储在实例中。
Student 类期望名字和级别参数,然后级别值被存储在其实例上。
由于Student 类扩展了Human 类,Student 类用name 参数调用super() 方法,这将调用Human 类的构造函数并存储名称。
最后,两个类都定义了greet() 函数。
class Human{
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello ${this.name}!`);
}
}
class Student extends Human {
constructor(name, level) {
super(name);
this.level = level;
}
greet() {
console.log(`Hello ${this.name} from ${this.level}`);
}
}
我们在实例化这些对象时传递的参数可以在类的构造函数中访问。
每当一个对象在类外被实例化时,构造函数就会被调用,我们通过使用new 关键字来做到这一点,如下所示。
我们从人类类中实例化了一个对象,从学生类中实例化了另外两个对象。
在第三个对象中,也就是我们从学生类中实例化出来的对象,我们直接对该对象定义了一个greet() 函数。
const o1 = new Human("John");
const o2 = new Student("Tina", "1st Grade");
const o3 = new Student("Mary", "2nd Grade");
o3.greet = () => console.log('I am wonderful!');
o1.greet();
o2.greet();
o3.greet();
预期输出
Hello John!
Hello Tina from 1st Grade
I am wonderful!
当我们测试这个脚本时会发生什么呢?
- 构造01将使用它的类(人的类)中的问候方法。
- 构造02将使用学生类的greet方法。
- Const 03将使用它自己直接定义的greet方法。
结论
JSX语法被Babel转译并被React用来创建对象的实例。因此,在Babel中使用JSX时,我们需要导入react。这就像告诉Babel你要提供一个JJSX文件。
一个React组件实例使用类来实例化一个react组件。你可以在你的React应用程序中使用多个实例或只使用一个实例。每个实例都可以单独执行,使它们成为创建应用程序时的一个要求。实例是原始类的复制品。