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

news2024/11/15 9:09:37

《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.coloradmin.cn/o/934582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ同步复制和异步复制

如果一个Broker组有Master和Slave&#xff0c;消息需要从Master复制到Slave上&#xff0c;有同步和异步两种复制方式。 1)同步复制 同步复制方式是等Master和Slave均写成功后才反馈给客户端写成功状态&#xff1b; 在同步复制方式下&#xff0c;如果Master出故障&#xff0c…

调用paddleocr接口实现文本检测与识别,并在图像中显示识别结果

目录 一、按照官网步骤安装paddlepaddle和paddleocr(paddlepaddle我安装的是cpu版本) 二、运行下面的脚本 三、图像结果 一、按照官网步骤安装paddlepaddle和paddleocr(paddlepaddle我安装的是cpu版本) doc/doc_ch/quickstart.md PaddlePaddle/PaddleOCR - Gitee.com 二、…

IDEA对Web和Tomcat的一些配置

这里只是做了自己学习中的一点记录&#xff0c;仅供参考哈&#xff01; 配置Tomcat Modules新增Web 新增module后新增Artifacts 新增Artifacts后Tomcat新增布署 将指定的module由普通java项目变成web项目 直接创建布署到Tomcat时所需要的Aritifacts包 配置Servlet的依赖包 配置…

初识【类和对象】

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的…

Java进阶篇--创建线程的四种方式

目录 继承Thread类 扩展小知识&#xff1a; Thread类的常见方法 Thread 类的静态方法 实现Runnable接口 使用Callable和Future创建线程 使用Executor框架创建线程池 继承Thread类 创建一个继承自Thread类的子类&#xff0c;并重写其run()方法&#xff0c;将相关逻辑实现…

Flink CDC数据同步

背景 随着信息化程度的不断提高&#xff0c;企业内部系统的数量和复杂度不断增加&#xff0c;因此&#xff0c;数据库系统的同步问题已成为越来越重要的问题。 缓存失效 在缓存中缓存的条目(entry)在源头被更改或者被删除的时候立即让缓存中的条目失效。如果缓存在一个独立的…

“返璞归真,数字排毒”,放下智能手机,美国功能手机卷土重来

近年来&#xff0c;智能手机的普及已经改变了人们的生活方式和沟通方式。然而&#xff0c;随着科技的不断进步和不断涌现的各种新应用程序&#xff0c;一些年轻人开始感到疲惫和厌倦。他们觉得智能手机带来了太多的干扰和依赖&#xff0c;也让人们容易沉迷于社交媒体和短视频。…

Rabbitmq的Federation Exchange

(broker 北京 ) &#xff0c; (broker 深圳 ) 彼此之间相距甚远&#xff0c;网络延迟是一个不得不面对的问题。有一个在北京的业务(Client 北京 ) 需要连接 (broker 北京 ) &#xff0c;向其中的交换器 exchangeA 发送消息&#xff0c;此时的网络延迟很小&#xff0c;(C…

全球边缘计算大会的十大至暗时刻

来源网友X小缘 ① 背景板文字全球边缘计算大会&#xff0c;被广告公司改为全球边缘计算机大会&#xff0c;因为他觉得少了个机字&#xff1b; ② 明天开会&#xff0c;今天遇到恶劣天气&#xff0c;讲师主持人一整晚滞留外地机场&#xff1b; ③ 视频直播的时候声音通道没开&am…

Redis数据结构全解析【超详细万字分析】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O&#xff08;1&#xff09;复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

236. 二叉树的最近公共祖先-优化

本期我们对该题进行优化&#xff0c;不知道题目的小伙伴建议先看看之前的 236. 二叉树的最近公共祖先_KLZUQ的博客-CSDN博客 我们要将时间复杂度优化为O(N) class Solution { public:bool FindPath(TreeNode* root, TreeNode* x,stack<TreeNode*>& path){if(rootnul…

Kubernetes(K8s)基本环境部署

此处只做学习使用&#xff0c;配置单master环境。 一、环境准备 1、ip主机规划&#xff08;准备五台新机&#xff09;>修改各个节点的主机名 注意&#xff1a;关闭防火墙与selinux 节点主机名ip身份joshua1 kubernetes-master.openlab.cn 192.168.134.151masterjoshua2k…

无涯教程-分类算法 - 朴素贝叶斯

朴素贝叶斯算法是一种基于应用贝叶斯定理的分类技术&#xff0c;其中强烈假设所有预测变量彼​​此独立。简而言之&#xff0c;假设是某个类中某个要素的存在独立于同一类中其他任何要素的存在。 在贝叶斯分类中&#xff0c;主要的兴趣是找到后验概率&#xff0c;即给定某些观…

抽象类和接口有什么区别?

在 Java 中&#xff0c;抽象类和接口是两种不同的类类型。它们都不能直接实例化&#xff0c;并且它们都是用来定义一些基本的属性和方法的&#xff0c;但它们有以下几点不同&#xff1a; 定义不同&#xff1a;定义的关键字不同&#xff0c;抽象类是 abstract&#xff0c;而接口…

Linux操作系统--包管理yum

1.概述 YUM(全称为 Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。…

软考:中级软件设计师:数据库并发控制,完整性约束,数据库安全

软考&#xff1a;中级软件设计师:数据库并发控制 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

CrossOver 23 新功能介绍 CrossOver 23 版本更新了哪些功能

本次发布的CrossOver 23为用户带来了许多令人期待的新功能和优化&#xff0c;特别是对游戏方面的支持&#xff0c;更是让广大Mac游戏玩家兴奋。CrossOver 23包括对Wine 8.0.1的更新&#xff0c;带来了5000多处改动&#xff0c;对各种应用程序进行了改进。该版本还包括 Wine Mon…

AD9361配置采用纯PL方式,QT编写的小软件可以快速实现

采用ADI官方的API函数&#xff0c;虽然能够快速的实现AD9361配置&#xff0c;让我们不必关注9361的内部寄存器的配置过程&#xff0c;但是在实际的项目开发过程中&#xff0c;也在一定程度上限制了AD9361与PL之间数据交互的灵活性。 今天给大家推荐采用AD9361官方提供的配置软…

Linux操作系统--克隆虚拟机

1.概述 我们在搭建大数据或者是集群的过程中,需要使用到许多配置相同或者相类似的环境。这一个时候就需要使用到克隆虚拟机的功能。 2.克隆虚拟机过程 (1).从现有虚拟机(关机状态)克隆出新虚拟机,右键选择管理=>克隆,如下所示 (2).直接点击下一步。如下所示 (3).选择…

什么是浮动(float)?请解释清楚浮动对父元素和兄弟元素的影响。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浮动&#xff08;Float&#xff09;⭐ 浮动对父元素的影响⭐ 浮动对兄弟元素的影响⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入…