ReactJS 初学者教程
什么是 ReactJS?
ReactJS 是一个用于构建用户界面的开源前端 JavaScript 库。ReactJS 由 Facebook 以及一个由独立开发者和公司组成的社区共同维护。它被广泛用作构建单页网站和移动应用的基础。它非常易于使用,并允许用户创建可重用的 UI 组件。
ReactJS 的特性
JSX:JSX 是 JavaScript 的一个扩展。虽然在 React 中使用 JSX 不是强制性的,但它是一个很好的特性,并且易于使用。
组件:组件就像纯粹的 JavaScript 函数,通过将逻辑拆分为可重用的独立代码,有助于简化代码。我们可以将组件用作函数和类。组件还有 state 和 props,这使得开发变得容易。在一个类中,每个 props 的 state 都会被维护。
虚拟 DOM:React 创建一个虚拟 DOM,即内存中的数据结构缓存。只有 DOM 的最终更改才会在浏览器的 DOM 中更新。
JavaScript 表达式:JS 表达式可以使用花括号(例如 {})在 JSX 文件中使用。
ReactJS 的优点
以下是使用 ReactJS 的重要优点/好处:
- ReactJS 使用虚拟 DOM,它利用内存中的数据结构缓存,只有最终的更改才会在浏览器 DOM 中更新。这使得应用程序更快。
- 您可以使用 React 的组件功能创建您选择的组件。这些组件可以重用,也有助于代码维护。
- ReactJS 是一个开源的 JavaScript 库,所以很容易上手。
- ReactJS 在短时间内变得非常流行,并由 Facebook 和 Instagram 维护。许多著名公司如苹果、Netflix 等都在使用它。
- Facebook 维护着 ReactJS 这个库,所以它得到了很好的维护并保持更新。
- ReactJS 可用于为桌面和移动应用开发丰富的用户界面。
- 易于调试和测试,因为大部分编码是在 JavaScript 中完成的,而不是在 HTML 中。
ReactJS 的缺点
以下是使用 ReactJS 的缺点/弊端:
- 大部分代码是用 JSX 编写的,即 HTML 和 CSS 是 JavaScript 的一部分,这可能会有些混乱,因为大多数其他框架倾向于将 HTML 与 JavaScript 代码分开。
- ReactJS 的文件大小较大。
通过 CDN 使用 ReactJS
要开始使用 React,我们首先需要安装 ReactJS。您可以轻松地通过使用 CDN JavaScript 文件来开始使用 ReactJS,如下所示。
访问 ReactJS 的官方网站以获取 CDN 链接,即 https://reactjs.ac.cn/docs/cdn-links.html,您将获得解释下图所需的文件。
用于开发
<script crossorigin src="https://unpkg.com/react@version/umd/react.development.js"></script> <script crossorigin src="https://unpkg.com/react-dom@version/umd/react-dom.development.js"></script>
用于生产
<script crossorigin src="https://unpkg.com/react@version/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@version/umd/react-dom.production.min.js"></script>
将 version 替换为 react-development.js 和 react-dom.development.js 的最新 React 版本。您可以在自己的服务器上托管这些文件以开始使用 ReactJS。
如果您计划使用 CDN 文件,请确保保留 cross-origin 属性,以避免跨域问题。ReactJS 代码不能直接在浏览器中执行,需要使用 Babel 转译为 JavaScript 后才能在浏览器中执行。
这是可以使用的 BabelJS 脚本:
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
这是一个使用 CDN 文件和 BabelJS 脚本的 ReactJS 工作示例。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Hello World</title> <script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script> </head> <body> <div id="app"></div> <script type="text/babel"> ReactDOM.render( <h1>Hello, from Guru99 Tutorials!</h1>, document.getElementById('app') ); </script> </body> </html>
输出
我们将在下一章详细介绍代码,这里我们先看看使用 CDN 文件的工作方式。据说直接使用 Babel 脚本不是一个好习惯,但新手可以暂时用它来学习 ReactJS。在生产环境中,您需要使用 npm 包来安装 React。
使用 NPM 包
确保您已安装 NodeJS。如果尚未安装,请参阅此 NodeJS 教程 (https://guru99.com.cn/node-js-tutorial.html) 进行安装。
安装 NodeJS 后,创建一个文件夹 reactproj/。
要开始项目设置,请运行命令 npm init。
文件夹结构将如下所示:
reactproj\ package.json
现在我们将安装所需的包。
以下是 ReactJS 的包列表:
npm install react --save-dev npm install react-dom --save-dev npm install react-scripts --save-dev
打开命令提示符,并在 reactproj/ 文件夹内运行上述命令。
创建一个文件夹 src/,所有的 JS 代码都将放在该文件夹中。ReactJS 项目的所有代码都将位于 src/ 文件夹中。创建一个文件 index.js 并添加 import react 和 react-dom,如下所示。
index.js
import React from 'react'; import ReactDOM from 'react-dom'; ReactDOM.render( <h1>Hello, from Guru99 Tutorials!</h1>, document.getElementById('root') );
我们返回了 ReactJS 的基本代码。我们将在下一章详细解释它。我们希望显示 Hello, from Guru99 Tutorials,并将其赋予 ID 为“root”的 DOM 元素。这是从 index.html 文件中获取的,该文件是起始文件,如下所示。
创建一个文件夹 public/ 并在其中添加 index.html,如下所示:
index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ReactJS Demo</title> </head> <body> <div id = "root"></div> </body> </html>
react-scripts 包将负责编译代码并启动服务器以显示 HTML 文件,即 index.html。您需要在 package.json 中添加命令,该命令将负责使用 react-scripts 来编译代码并启动服务器,如下所示:
"scripts": { "start": "react-scripts start" }
安装所有包并添加上述命令后,最终的 package.json 如下:
Package.json
{ "name": "reactproj", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "react-scripts start" }, "author": "", "license": "ISC", "devDependencies": { "react": "^16.9.0", "react-dom": "^16.9.0", "react-scripts": "^3.1.1" } }
要开始测试 ReactJS,请运行命令:
npm run start
C:\reactproj>npm run start > reactproj@1.0.0 start C:\reactproj > react-scripts start
它将在浏览器中打开 URL https://:3000/
,如下所示:
public/index.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ReactJS Demo</title> </head> <body> <div id = "root"></div> </body> </html>
在接下来的章节中,我们也将使用相同的过程来执行 JavaScript 文件。将您所有的 .js 和 .jsx 文件添加到 src/ 文件夹中。文件结构将如下所示:
reatproj/ src/ index.js node_modules/ public/ index.html package.json
如何创建您的第一个 React 项目设置
这是本 ReactJS 教程中开始第一个 React 应用程序的逐步指南。
步骤 1) 导入 React 包。
1. 要开始使用 ReactJS,我们首先需要导入 React 包,如下所示。
import React from 'react'; import ReactDOM from 'react-dom';
2. 将文件保存为 src/ 文件夹中的 index.js
步骤 2) 编写简单代码。
在本 React JS 教程中,我们将编写一个简单的代码,显示消息 “Hello, from Guru99 Tutorials!”
ReactDOM.render( <h1>Hello, from Guru99 Tutorials!</h1>, document.getElementById('root') );
ReactDOM.render 会将 <h1> 标签添加到 ID 为 root 的元素中。这是我们拥有的 HTML 文件:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ReactJS Demo</title> </head> <body> <div id = "root"></div> </body> </html>
步骤 3) 编译代码。
接下来,在本 React.js 教程中,我们需要编译代码以在浏览器中获取输出。
这是文件夹结构:
reactproj/ node_modules/ src/ index.js package.json public/ index.html
我们已经在 package.json 中添加了编译最终文件的命令,如下所示:
"scripts": { "start": "react-scripts start" },
要编译最终文件,请运行以下命令:
npm run start
当您运行上述命令时,它将编译文件并在有任何错误时通知您,如果一切正常,它将打开浏览器并在 https://:3000/index.html
运行 index.html 文件。
命令:npm run start
C:\reactproj>npm run start > reactproj@1.0.0 start C:\reactproj > react-scripts start
步骤 4) 检查输出。
一旦代码编译完成,URL https://:3000
将在浏览器中打开,如下所示:
什么是 JSX?
JSX 是 JavaScript 的一个扩展。它是一种模板脚本,您可以在其中同时使用 HTML 和 JavaScript 的强大功能。
这是一个 JSX 代码的简单示例。
const h1tag = "<h1>Hello, from Guru99 Tutorials!</h1>";
为什么我们需要在 React 中使用 JSX?
对于一个 UI,我们需要 HTML,并且 DOM 中的每个元素都需要处理事件、状态变化等。
在 React 中,它允许我们在同一个文件中使用 HTML 和 JavaScript,并以高效的方式处理 DOM 中的状态变化。
JSX 中的表达式
这是一个关于如何在 JSX 中使用表达式的简单示例。
在之前的 ReactJS 示例中,我们写过类似这样的代码:
index.js
import React from 'react'; import ReactDOM from 'react-dom'; ReactDOM.render( <h1>Hello, from Guru99 Tutorials!</h1>, document.getElementById('root') );
我们现在将更改上面的代码以添加表达式。表达式用在花括号 {} 中,并在运行时展开。React 中的表达式与 JavaScript 表达式相同。
index.js
import React from 'react'; import ReactDOM from 'react-dom'; const display = "Hello, from Guru99 Tutorials!"; const h1tag = "<h1>{display}</h1>"; ReactDOM.render( h1tag, document.getElementById('root') );
现在让我们在浏览器中测试一下。
您可以看到 {display} 表达式没有被替换。当在 .js 文件中使用表达式时,React 不知道该怎么做。
现在让我们进行更改并创建一个 .jsx 文件,如下所示:
test.jsx
import React from 'react'; import ReactDOM from 'react-dom'; const display = "Hello, to Guru99 Tutorials"; const h1tag =<h1>{display}</h1>; export default h1tag;
我们已经添加了所需的代码,并将在 index.js 中使用 text.jsx 文件。我们希望在 script.js 中使用 h1tag 变量,所以如上所示,在 test.jsx 中将其导出。
这是 index.js 中修改后的代码:
import React from 'react'; import ReactDOM from 'react-dom'; import h1tag from './test.jsx'; ReactDOM.render( h1tag, document.getElementById('root') );
要在 index.js 中使用 test.jsx,我们必须首先像下面这样导入它:
import h1tag from './test.jsx';
我们现在可以在 ReactDOM.render 中使用 h1tag,如下所示:
ReactDOM.render( h1tag, document.getElementById('root') );
这是我们在浏览器中检查时的输出:
ReactJS 中的组件是什么?
组件就像纯粹的 JavaScript 函数,通过将逻辑拆分为可重用的独立代码,有助于简化代码。
作为函数的组件
test.jsx
import React from 'react'; import ReactDOM from 'react-dom'; function Hello() { return <h1>Hello, from Guru99 Tutorials!</h1>; } const Hello_comp = <Hello />; export default Hello_comp;
我们创建了一个名为 Hello 的函数,它返回了一个 h1 标签,如上所示。函数名充当一个元素,如下所示:
const Hello_comp = <Hello />; export default Hello_comp;
组件Hello被用作一个 HTML 标签,即 <Hello />,并赋值给Hello_comp变量,然后使用 export 导出。
现在让我们在 index.js 文件中使用这个组件,如下所示:
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello_comp from './test.jsx'; ReactDOM.render( Hello_comp, document.getElementById('root') );
这是在浏览器中的输出:
作为组件的类
这是一个使用类作为组件的 ReactJS 示例。
test.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class Hello extends React. Component { render() { return <h1>Hello, from Guru99 Tutorials!</h1>; } } export default Hello;
我们可以在 index.js 文件中如下使用 Hello 组件:
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello from './test.jsx'; ReactDOM.render( <Hello />, document.getElementById('root') );
组件 Hello 被用作一个 HTML 标签,即 <Hello />。
这是它的输出。
ReactJS 中的 State 是什么?
State 是一个类似于 props 的 JavaScript 对象,它包含与 ReactJS render 一起使用的数据。State 数据是一个私有对象,在类内部的组件中使用。
State 示例
这是一个关于如何在类内部使用 state 的工作示例。
test.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class Hello extends React.Component { constructor(props) { super(props); this.state = { msg: "Hello, from Guru99 Tutorials!" } } render() { return <h1>{this.state.msg}</h1>; } } export default Hello;
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello from './test.jsx'; ReactDOM.render( <Hello />, document.getElementById('root') );
当我们在浏览器中测试它时,我们会得到这个:
ReactJS 中的 Props 是什么?
Props 是在组件内部使用的属性。它们就像全局对象或变量,可以在组件内部使用。
Props 到函数组件
这是一个将 props 传递给函数组件的示例。
import React from 'react'; import ReactDOM from 'react-dom'; function Hello(props) { return <h1>{props.msg}</h1>; } const Hello_comp = <Hello msg="Hello, from Guru99 Tutorials!" />; export default Hello_comp;
如上所示,我们向 <Hello /> 组件添加了 msg 属性。这可以在 Hello 函数内部作为 props 访问,它是一个包含 msg 属性详细信息的对象,并被用作表达式。
该组件在 index.js 中使用如下:
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello_comp from './test.jsx'; ReactDOM.render( Hello_comp, document.getElementById('root') );
这是在浏览器中的输出:
Props 到类组件
要在类中访问 props,我们可以这样做:
test.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class Hello extends React.Component { render() { return <h1>{this.props.msg}</h1>; } } export default Hello;
msg 属性在 index.js 中传递给组件,如下所示:
import React from 'react'; import ReactDOM from 'react-dom'; import Hello from './test.jsx'; ReactDOM.render( <Hello msg="Hello, from Guru99 Tutorials!" />, document.getElementById('root') );
这是在浏览器中的输出:
另请查看:- AngularJS 初学者教程:一步步学习 AngularJS
组件的生命周期
一个组件的生命周期分为初始化、挂载、更新和卸载阶段。
以下是关于每个组件的详细解释。
一个 ReactJS 组件有以下几个阶段:
初始化:这是组件生命周期的第一阶段。
在这里,它将具有初始级别的默认 props 和 state。
挂载:在这个阶段,组件被渲染到 DOM 中。在挂载状态下,我们可以使用以下方法。
- componentDidMount():当组件刚刚添加到 DOM 中时也会调用此方法。
- render():您为所有创建的组件都拥有此方法。它返回 HTML 节点。
更新:在此状态下,DOM 会被用户交互并更新。例如,您在文本框中输入一些内容,state 属性就会更新。
以下是更新状态中可用的方法:
- shouldComponentUpdate():在组件更新时调用。
- componentDidUpdate():在组件更新后调用。
卸载:当组件不再需要或被移除时,就会进入此状态。
以下是卸载状态下可用的方法:
componentWillUnmount():当组件被移除或销毁时调用。
工作示例
这是一个工作示例,显示了在每个状态下调用的方法。
示例:complife.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class COMP_LIFE extends React.Component { constructor(props) { super(props); this.state = {name: ''}; this.UpdateName = this.UpdateName.bind(this); this.testclick = this.testclick.bind(this); } UpdateName(event) { this.setState({name: event.target.value}); } testclick(event) { alert("The name entered is: "+ this.state.name); } componentDidMount() { console.log('Mounting State : calling method componentDidMount'); } shouldComponentUpdate() { console.log('Update State : calling method shouldComponentUpdate'); return true; } componentDidUpdate() { console.log('Update State : calling method componentDidUpdate') } componentWillUnmount() { console.log('UnMounting State : calling method componentWillUnmount'); } render() { return ( <div> Enter Your Name:<input type="text" value={this.state.name} onChange={this.UpdateName} /><br/> <h2>{this.state.name}</h2> <input type="button" value="Click Here" onClick={this.testclick} /> </div> ); } } export default COMP_LIFE;
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import COMP_LIFE from './complife.jsx'; ReactDOM.render( <COMP_LIFE />, document.getElementById('root') );
当您在浏览器中查看输出时
在浏览器控制台中您会得到
当用户在文本框中输入时
控制台中显示以下消息
处理表单
在 ReactJS 中,HTML 输入元素如 <input />、<textarea /> 和 <select /> 有它们自己的状态,当用户交互时需要使用 setState() 方法来更新。
在本章中,我们将学习如何在 ReactJS 中处理表单。
这是一个工作示例
form.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class Form extends React.Component { constructor(props) { super(props); this.state = {name: ''}; this.UpdateName = this.UpdateName.bind(this); this.formSubmit = this.formSubmit.bind(this); } UpdateName(event) { this.setState({name: event.target.value}); } formSubmit(event) { alert("The name entered is: "+ this.state.name); } render() { return ( <form> Enter Your Name:<input type="text" value={this.state.name} onChange={this.UpdateName} /><br/> <h2>{this.state.name}</h2> <input type="submit" value="Submit" onClick={this.formSubmit} /> </form> ); } } export default Form;
对于输入字段,我们需要维护状态,为此 React 提供了一个特殊的方法叫做 setState,它有助于在发生变化时维护状态。
我们在文本框和提交按钮上使用了 onChange 和 onClick 事件。当用户在文本框中输入时,onChange 事件被调用,并且 state 对象中的 name 字段被更新,如下所示:
UpdateName(event) { this.setState({name: event.target.value}); }
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Form from './form.jsx'; ReactDOM.render( <Form />, document.getElementById('root') );
在浏览器中的输出如下:
步骤 1) 在文本框中输入您的姓名
- 点击提交按钮
在 ReactJS 中处理事件
在 ReactJS 中处理事件与您在 JavaScript 中的做法相同。您可以使用 JavaScript 中使用的所有事件处理程序。当用户与任何 HTML 元素交互时,使用 setState() 方法来更新状态。
这是一个关于如何在 ReactJS 中使用事件的工作示例。
events.jsx
import React from 'react'; import ReactDOM from 'react-dom'; class EventTest extends React.Component { constructor(props) { super(props); this.state = {name: ''}; this.UpdateName = this.UpdateName.bind(this); this.testclick = this.testclick.bind(this); } UpdateName(event) { this.setState({name: event.target.value}); } testclick(event) { alert("The name entered is: "+ this.state.name); } render() { return ( <div> Enter Your Name:<input type="text" value={this.state.name} onChange={this.UpdateName} /><br/> <h2>{this.state.name}</h2> <input type="button" value="Click Here" onClick={this.testclick} /> </div> ); } } export default EventTest;
对于输入字段,我们需要维护状态,为此 React 提供了一个特殊的方法叫做 setState,它有助于在发生变化时维护状态。
我们在文本框和按钮上使用了 onChange 和 onClick 事件。当用户在文本框中输入时,onChange 事件被调用,并且 state 对象中的 name 字段被更新,如下所示:
UpdateName(event) { this.setState({name: event.target.value}); }
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import EventTest from './events.jsx'; ReactDOM.render( <EventTest />, document.getElementById('root') );
这是在浏览器中的输出:
当用户输入姓名时
当用户点击“Click Here”按钮时
在 ReactJS 中使用内联 CSS
我们将看一个工作示例来理解在 ReactJS 中内联 CSS 的工作原理。
addstyle.jsx
import React from 'react'; import ReactDOM from 'react-dom'; const h1Style = { color: 'red' }; function Hello(props) { return <h1 style={h1Style}>{props.msg}</h1>; } const Hello_comp = <Hello msg="Hello, from Guru99 Tutorials!" />; export default Hello_comp;
我为 h1 标签添加了 color: ‘red’ 样式。
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello_comp from './addstyle.jsx'; ReactDOM.render( Hello_comp, document.getElementById('root') );
在浏览器中的输出如下:
您可以创建一个您想要应用在元素上的样式对象,并使用表达式来添加样式,如上例所示。
在 ReactJS 中使用外部 CSS
让我们创建一个外部 CSS,为此创建一个文件夹 css/ 并在其中添加 style.css。
style.css
.h1tag { color:red; }
将 style.css 添加到您的 index.html 文件中
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>ReactJS Demo</title> <link href="css/style.css" rel="stylesheet" type="text/css" /> </head> <body> <div id = "root"></div> <script src = "out/script.min.js"></script> </body> </html>
现在让我们在 .jsx 文件中为 h1 标签添加类
addstyle.jsx
import React from 'react'; import ReactDOM from 'react-dom'; let classforh1 = 'h1tag'; function Hello(props) { return <h1 className={classforh1}>{props.msg}</h1>; } const Hello_comp = <Hello msg="Hello, from Guru99 Tutorials!" />; export default Hello_comp;
index.js
import React from 'react'; import ReactDOM from 'react-dom'; import Hello_comp from './addstyle.jsx'; ReactDOM.render( Hello_comp, document.getElementById('root') );
className 属性被赋予了类名详情。现在让我们在浏览器中测试一下。
当您在浏览器中检查 h1 标签时,您会看到这个
您可以看到 class=” h1tag” 已成功添加到 h1 标签中。
摘要
- ReactJS 是一个用于构建用户界面的开源前端 JavaScript 库。它由 Facebook 维护,并被当今许多公司用于 UI 开发。
- ReactJS 的核心特性包括 JSX、组件(函数式组件和基于类的组件)、组件的生命周期、组件的 props 和 state 支持、以及使用 JavaScript 表达式。
- ReactJS 的项目设置解释了如何使用 CDN 文件以及如何使用 npm 包来构建项目。
- JSX 是 JavaScript 的一个扩展。它是一种模板脚本,您可以在其中同时使用 HTML 和 JavaScript 的强大功能。
- 组件就像纯粹的 JavaScript 函数,通过将逻辑拆分为可重用的独立代码,有助于简化代码。
- State 是一个类似于 props 的 JavaScript 对象,它包含与 ReactJS render 一起使用的数据。State 数据是一个私有对象,在类内部的组件中使用。
- Props 是在组件内部使用的属性。
- 一个组件的生命周期分为初始化、挂载、更新和卸载阶段。
- 在 ReactJS 中,HTML 输入元素如 <input />、<textarea /> 和 <select /> 有它们自己的状态,当用户交互时需要使用 setState() 方法来更新。
- 在 ReactJS 中处理事件与您在 JavaScript 中的做法相同。您可以使用 JavaScript 中使用的所有事件处理程序。当用户与任何 HTML 元素交互时,使用 setState() 方法来更新状态。
- ReactJS 允许您使用 JavaScript 表达式来处理外部 CSS 以及内联 CSS。
另请查看:- 70 个热门 React 面试问题与答案(更新版)