章节 3:React.js基础 -《React.js手把手教程:从初学者到实战高手》- 第一部分:React.js基础

《React.js手把手教程:从初学者到实战高手》
第一部分:React.js基础

章节 3:React.js基础

在这一章中,我们将进一步了解 React.js 的基础知识。我们会从最基本的 React 组件开始,逐步引导你进入 React.js 的世界。

React组件的基本结构

React.js 中,有两种定义组件的方式,分别是函数式组件function component)和类组件class component)。React 官方目前似乎更推崇函数式组件,因此在本书中,我们将更多地使用函数式组件。但在本小节中,我也会向你简单介绍类组件的写法。

用你喜欢的编辑器(例如:VS Code)再次打开我们之前创建的 my-react-app 项目,在 src 目录下创建一个新的文件夹 components,我们将用这个文件夹存放我们自己创建的组件。

然后,我们将在 src/components 文件夹中创建一个名为 HelloWorld.js 的文件,并将以下代码添加到其中:

import React from 'react';function HelloWorld() {return (<h1>Hello, World!</h1>);
}export default HelloWorld;

在上面的代码中,我们定义了一个名为 HelloWorld 的函数式组件,它的返回值是我们在前面学过的JSX,这个JSX的内容内容比较好理解,它是一个HTML中的 h1 标签。对于函数式组件,它的返回值就是渲染在页面上的内容。

接下来,我们再来看看类组件的写法。其实我们在前面的章节中已经初步认识过类组件。

src/components 文件夹中创建一个名为 Greeting.js 的文件,并将以下代码加入进去:

import React, { Component } from 'react';class Greeting extends Component {render() {return (<h1 style={{ color: 'red' }}>Hello from the Greeting class component!</h1>);}
}export default Greeting;

在上面的代码中,我们定义了一个名为 Greeting 的类组件。对于类组件,它应该继承自 ReactComponent 类,并需要有一个 render 方法。render 方法的返回值就是这个组件渲染在网页上的内容。

使用组件

现在我们已经创建了一个简单的函数式组件 HelloWorld 和一个类组件 Greeting,接下来我们将学习如何使用它们。

打开项目中的 src/App.js,用以下代码替换掉原来的代码:

import React from 'react';
import './App.css';
import HelloWorld from './components/HelloWorld';
import Greeting from './components/Greeting';function App() {return (<div className="App"><HelloWorld /><Greeting /></div>);
}export default App;

让我来对这些代码做一些解释,使你能了解这些代码是什么意思。

先来看看以下这两行代码:

import HelloWorld from './components/HelloWorld';
import Greeting from './components/Greeting';

你在接触本书之前应该就已经对 import 有所了解了。以上两行代码将我们刚才创建的两个组件导入了当前文件中。

再来看 App 组件中是如何使用 HelloWorldGreeting 这两个组件的。

      <HelloWorld /><Greeting />

以上这两行代码分别将 HelloWorldGreeting 这两个组件加入了 App 组件中。

HelloWorldGreeting 是组件的名字。对于组件,在JSX中用 <> 将其名字包起来就能使用了。

由于 HelloWorld 是函数式组件,因此当 App 组件渲染在页面上时, HelloWorld 组件的返回值将会呈现在 <HelloWorld /> 所在的位置。

由于 Greeting 是类组件,因此当 App 组件渲染在页面上时, Greeting 组件的 render 函数的返回值将会呈现在 <Greeting /> 所在的位置。

接下来让我们看看代码运行后的效果。用以下命令启动项目(如果你的项目正在运行中,则不用再次执行此命令,当修改文件后,网页会自动应用最新的代码):

npm start

然后你将在网页中看到如下结果:

简单的组件

向组件传递数据(Props)

React 中,通过 props 参数,我们可以向组件传递数据。这让我们可以根据不同的数据渲染出不同的内容,使组件具有的复用的意义。

我们继续在 src/components 文件夹中创建一个名为 WelcomeMessage.js 的文件,并将以下代码添加到其中:

import React from 'react';function WelcomeMessage(props) {return (<div><h2>Welcome, {props.name}!</h2><p>{props.message}</p></div>);
}export default WelcomeMessage;

在上面的代码中,我们定义了一个名为 WelcomeMessage 的函数式组件,它接收一个名为 props 的参数。通过 props,我们可以获取传递给组件的数据,然后在组件中使用。

接下来,我们需要在 App.js 文件中使用刚刚创建的 WelcomeMessage 组件,并向其传递数据:

import React from 'react';
import './App.css';
import HelloWorld from './components/HelloWorld';
import Greeting from './components/Greeting';
import WelcomeMessage from './components/WelcomeMessage';function App() {return (<div className="App"><HelloWorld /><Greeting /><WelcomeMessage name="Alice" message="Welcome to our website!" /><WelcomeMessage name="Bob" message="Hello there!" /></div>);
}export default App;

注意以下两行代码:

      <WelcomeMessage name="Alice" message="Welcome to our website!" /><WelcomeMessage name="Bob" message="Hello there!" />

这两行代码加入了两个 WelcomeMessage 组件,但传递的参数不同。

JSX 中,用属性props)给组件传递参数。写法与HTML元素类似。

上面的代码给第一个WelcomeMessage 组件传递了两个参数,分别是 namemessage,它们的值分别是 "Alice""Welcome to our website!"

给第二个WelcomeMessage 组件也传递了两个参数 namemessage,它们的值分别是 "Bob""Hello there!"

再回过头来看看 WelcomeMessage 组件是如何使用这些参数的。注意 WelcomeMessage 组件中的以下两行代码:

      <h2>Welcome, {props.name}!</h2><p>{props.message}</p>

在组件中,参数 props 对应的就是传递过来的参数,它是一个 Object

由于我们在 App.js 中给 WelcomeMessage 组件传递了 namemessage 两个参数,那么组件 WelcomeMessage 所接收到的 props 参数中就会有 namemessage 这两个数据。

JSX 中,{} 内包含的是 JavaScript表达式。因此当这个组件渲染时, {props.name}{props.message} 将分别对传递过来的 namemessage 参数的值所替换。

这时,你的浏览器中应该显示的是下面这个样子(由于项目正在运行中,因此当修改代码后,浏览器会自动应用最新的代码):
组件传参
以上是函数式组件接收参数的示例。我们再来看看在类组件中是如何接收参数的。

我们现在将 WelcomeMessage 组件修改为类组件。将 src/components/WelcomeMessage.js 中的代码修改为以下这个样子:

import React from 'react';class WelcomeMessage extends React.Component {render () {return (<div><h2>Welcome, {this.props.name}!</h2><p>{this.props.message}</p></div>);}
}export default WelcomeMessage;

在类组件中,传递过来的参数存在于 this.props 中。因此这里可以用 this.props.namethis.props.message 获得传递过来的 namemessage 参数的值。

对于这个类组件,JSX 中的每个 <WelcomeMessage /> 都是一个 WelcomeMessage 类的实例。如果你要为这个类组件补齐构造函数,它应该是类似以下这样子的:

    constructor (props) {super(props);}

保存代码后,你将会发现网页中显示的与之前是一样的。也就是说,这个类组件与之前的函数式组件所渲染的内容是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/84393.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word 调整列表缩进

word 调整列表缩进的一种方法&#xff0c;在试了其他方法无效后&#xff0c;按下图所示顺序处理&#xff0c;编号和文字之间的空白就没那么大了。 即右键word上方样式->点击修改格式->定义新编号格式->字体->取消勾选 “……对齐到网格”->确定

c++ qt--事件(第六部分)

c qt–事件&#xff08;第六部分&#xff09; 一.编辑伙伴&#xff0c;编辑顺序&#xff08;按TAB进行切换&#xff09; 1.编辑伙伴 此功能在设计界面如下的位置 1.设置伙伴关系 鼠标左键长按一个Label组件然后把鼠标移到另一个组件上 2.伙伴关系的作用 伙伴关系的作用就是…

docker 学习-- 04 实践搭建 1(宝塔)

docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; docker 学习-- 01 基础知识 docker 学习-- 02 常用命令 docker 学习-- 03 环境安装 docker 学习-- 04 实践 1&#xff08;宝塔&#xff09; 通过上面的学习&#xff0c; 已经可以搭建简单的案例&#xff0c; 接着我会搭…

二、前端监控之方案调研

前端监控体系 一个完整的前端监控体系包括了日志采集、日志上报、日志存储、日志切分&计算、数据分析、告警等流程。 对于一名前端开发工程师来说&#xff0c;也就意味着工作不再局限于前端业务的开发工作&#xff0c;需要有Nginx服务运维能力、实时/离线分析能力、Node应…

WPF基础入门-Class6-WPF通知更改

WPF基础入门 Class6-WPF通知 1、显示页面&#xff1a; <Grid><StackPanel><TextBox Text"{Binding Name}"></TextBox><TextBox Text"{Binding Title}"></TextBox><Button Command"{Binding ShowCommand}&qu…

iMX6ULL 库移植 | Libgpiod 库的交叉编译及使用指南(linux)

GPIO口的操作&#xff0c;是很常见的功能。传统的GPIO sysfs接口已被弃用。自Linux 4.8起&#xff0c;内核提供了全新的操作gpio的方式libgpiod&#xff08;C library and tools for interacting with the linux GPIO character device&#xff09;&#xff0c;当然也更高效&am…

Electron学习3 使用serialport操作串口

Electron学习3 使用serialport操作串口 一、准备工作二、 SerialPort 介绍1. 核心软件包(1) serialport(2) serialport/stream(3) serialport/bindings-cpp(4) serialport/binding-mock(5) serialport/bindings-interface 2. 解析器包3. 命令行工具 三、创建一个demo程序1. 创建…

docker harbor私有库

目录 一.Harbor介绍 二.Harbor的特性 三.Harbor的构成 四.Harbor构建Docker私有仓库 4.2在Server主机上部署Harbor服务&#xff08;192.168.158.25&#xff09; 4.2.1 这时候这边就可以去查看192.168.158.25网页 4.3此时可真机访问serverIP 4.4通过127.0.0.1来登陆和推送镜…

【sgOvalMenu】自定义组件:椭圆形菜单,菜单按钮可以随着椭圆轨迹进行循环运动

特性&#xff1a; 可以设置椭圆轨迹宽度、高度 可以设置椭圆轨迹旋转角度&#xff0c;并且自动纠偏菜单文字水平状态可以设置运动轨迹坐标移动步长可以设置运动轨迹改变频率可以设置顺时针还是逆时针旋转 sgOvalMenu源码 <template><div :class"$options.name&…

LLMs多任务指令微调Multi-task instruction fine-tuning

多任务微调是单任务微调的扩展&#xff0c;其中训练数据集包括多个任务的示例输入和输出。在这里&#xff0c;数据集包含指导模型执行各种任务的示例&#xff0c;包括摘要、评论评分、代码翻译和实体识别。 您在这个混合数据集上训练模型&#xff0c;以便它可以同时提高模型在…

每日一博 - 闲聊云原生和容器编排

文章目录 概念1. 云原生&#xff08;Cloud Native&#xff09;&#xff1a;2. 容器编排&#xff08;Container Orchestration&#xff09;&#xff1a; 小结 概念 云原生和容器编排是两个不同的概念&#xff0c;但它们之间有着密切的联系。下面将分别介绍这两个概念&#xff0…

react解决死循环方法?

使用useeffect&#xff08;副作用&#xff09;方法结束这个操作 1、导入useeffect、useState 2、把下方代码写入&#xff1a;里面填写的是你要终止某个东西的代码 注意&#xff1a;不可不写&#xff0c;也可以写依赖或不写