为什么使用 React 以及前端框架

工作原理

React 通过构建虚拟 DOM(Virtual DOM)来高效管理界面。当组件的状态或属性发生变化时,React 会重新渲染生成新的虚拟 DOM,并通过 Diff 算法找出新旧虚拟 DOM 树之间的差异,最终仅将发生变化的部分同步到真实 DOM 中。这种方式避免了不必要的 DOM 操作,从而提升性能。

div: App
h1: Title
div: Content
p: Hello World
button: Click Me

CDN 引入

在不使用打包工具(如 Vite、Webpack、Create React App)的前提下,你可以通过 CDN 直接引入 React 和 ReactDOM,然后在 HTML 文件中使用 React。

<!-- React 和 ReactDOM CDN(必须使用 development 版本) -->
<script src="https://unpkg.com/react@18/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js" crossorigin></script><!-- Babel(用于解析 JSX) -->
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

随后在 script 标签添加 React 代码,JSX 是不是浏览器原生支持的语法,所以必须通过 Babel 来转译 <App /> 这样的语法。

<script type="text/babel">// 定义一个简单组件function App() {return <h1>Hello, React + CDN!</h1>;}// 渲染组件const root = ReactDOM.createRoot(document.getElementById('example'));root.render(<App />);
</script>
项目CDN 地址用途
React 核心库https://unpkg.com/react@18/umd/react.development.js提供 React 全局对象,支持定义组件等功能
ReactDOMhttps://unpkg.com/react-dom@18/umd/react-dom.development.js提供 ReactDOM 全局对象,支持将组件渲染到 DOM 上
Babelhttps://unpkg.com/@babel/standalone/babel.min.js让浏览器在运行时解析 JSX

由于 unpkg 提供的 CDN 在国内没有节点,可以使用其他镜像的 CDN 提供 react 框架代码

<script src="https://cdn.jsdelivr.net/npm/react@18/umd/react.development.js"></script>
<script src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@babel/standalone/babel.min.js"></script>

[!NOTE]

file:/// 协议下,浏览器会出于安全考虑 禁止脚本发出网络请求或模块加载;因此如果需要预览,至少需要开启 VSCode 的 Live Server 预览插件。

NPM 脚手架

脚手架方法创建项目有两种方法,一种是

通过 NPM 脚手架方式创建 React 项目需要 Node.js 环境,首先要确保本地安装了对应环境,版本应该在 16 以上

npm -v  # 检查 node.js 环境版本

通过 Vite 创建 React 项目

npm create vite@latest
#npm create vite@4.1.0

随后输入项目名称,选择框架、语言后创建即可。创建完成后需要进入项目文件夹随后安装所有第三方依赖

cd react-demo #  这里换成刚刚创建的项目名称文件夹
npm install  # 安装所有第三方库

最后如果需要运行,可以直接运行前端服务器

npm run dev

随后进入给出的地址即可,一般是 http://localhost:5173

[!NOTE]

编译项目

npm build

随后在 build 文件夹中找到编译后的文件即可

基本项目结构

创建项目后,应该有以下文件

  • node_modules: 存放第三方库的文件夹,一般被加入到 gitignore 中
  • public: 公共资源,比如图片和视频等
  • src: 前端网站的源代码
    • App.tsx 作为初始项目的组件
    • index.css
    • App.css 使用 Vite 构建时自带给的样式文件,后期一般自己定义
  • index.html: 项目入口
  • package.json: 对这个 node 项目的一般信息和设置等

[!NOTE]

注意,除了基本的 JavaScript(.js文件)和 TypeScript(.ts文件),还有对应的扩展文件分别为 .jsx 和 .tsx

React 快速入门

创建组件

React 组件是构建 React 应用的基本单位,组件可以分为函数组件和类组件。

React 应用程序是由 组件 组成的。一个组件是 UI(用户界面)的一部分,它拥有自己的逻辑和外观。组件可以小到一个按钮,也可以大到整个页面,组件的设计让整个 UI 结构化,并且可以复用一些常用组件。React 组件现在比较流行与用返回标签的 JavaScript 函数来编写,这样更加轻便逻辑更加简单:

创建一个 Message 组件,在 src 文件夹下创建 Message.tsx

function Message() {// JSX: JavaScript XMLreturn <h1>Hello, World!</h1>;
}export default Message;

在这里,似乎是在 JavaScript 中返回了一个 html 标签,但事实上,这里返回的是 JavaScript XML,属于 JavaScript 扩展的语法代码。实际上,这个代码会先转换成普通 JS 代码,再渲染到 HTML 前端中。

在这里,可以使用 <Message></Message> 来调用组件,而给出的代码使用的是自闭合标签,让组件标签更加清晰。

[!NOTE]

React 组件必须以大蛇式或帕斯卡(PascalCasing)命名,而 HTML 标签是小写字母,两者予以区分。

你可以在这个工具网站看看过程 babeljs.io/repl ,babel 就是在 CDN 引用方法中提到的解析工具。

<h1>hello world</h1>
import { jsx as _jsx } from "react/jsx-runtime";
/*#__PURE__*/_jsx("h1", {children: "hello world"
});

可以看出,扩展语法并不是简单的写入前端代码,只是将 js 的渲染更改的更加简单。

编写完组件之后,需要将这个组件作为默认对象从其中导出,这样在其他代码中就可以复用这个组件。export default 关键字指定了文件中的主要组件。如果对 JavaScript 某些语法不熟悉,可以参考 MDN 和 javascript.info。

应用组件,在 App.tsx 中重新编写一个利用 Message 组件来打印 hello world 的页面。

import Message from './Message';function App() {return <div><Message /></div>;
}export default App;

随后运行网站,直接访问给出地址,就可以看到定义在 Message 中的 helloword 信息。

在 tsx 代码中,可以通过变量来动态修整显示信息,创建变量的方法与 js 类似,而在标签内显示变量需要用花括号括起来。

function Message() {const name = "Cacciatore";return <h1>Hello, {name}!</h1>;
}
export default Message;

引入样式

首先通过 npm 为本项目下载前端样式框架

npm install bootstrap  # Bootstrap

随后在 main.tsx 中可以看到默认引用了 index.css 现在更改成之前下载的框架,修改后如下。

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import 'bootstrap/dist/css/bootstrap.css'
import App from './App.tsx'createRoot(document.getElementById('root')!).render(<StrictMode><App /></StrictMode>,
)

这样就直接导入了 Boostrap 作为前端样式框架

现在创建一个新的组件,比如创建一个列表组件,首先在 src 文件夹创建一个 components 文件夹用于存放所有组件代码,这样子更加方便项目的源代码管理。

function ListGroup() {return (<ul className="list-group"><li className="list-group-item">123</li><li className="list-group-item">321</li><li className="list-group-item">abc</li><li className="list-group-item">xyz</li></ul>);
}export default ListGroup;

这是一个创建列表的组件,首先利用一般的 HTML 语法创建了一个列表,其次将元素的类赋予 Bootstrap 样式预先定义的类,这样子就可以生成一个带有定义样式的列表组件,将其载入到 App.tsx 后即可在前端查看。

[!NOTE]

  • 如果你使用 VSCode 作为 IDE,你可能会知道它自带了格式化文档的功能,让代码直接格式化成符合缩进的样子,快捷键 ctrl + shift + I,除了自带的格式化样式,还可以安装插件 Prettier ,这个插件提供了更好的格式化功能,当下载好后第一次去格式化文档 IDE 会让你设置使用普通的还是 Prettier 提供的进行格式化。

  • class 在 js 中属于关键字,因此在这里的返回标签应该使用 className 作为类的引用。

组件函数返回与碎片

组件函数只能返回一个根元素,如果说,在上面的列表,我们想要添加一个 h1 元素作为这个列表的名称,是不可行的,因为这样将包含一个 h1 元素和 ul 列表元素,这是因为在上文提到,这里返回的不是一个简单的 HTML 前端代码,这些会被转换成 js 代码,因此必须只有一个根元素作为参数然后渲染。如果通过在这两个元素外套一个 div 元素将他们包裹,一起返回这一个外面的 div 元素给 react, 虽然可以解决这个问题,但是这里多出一个 div 元素,只是为了让参数正确是不必要的,而且会增加文件结构的复杂度。因此,这里引入碎片来解决这个问题。

import { Fragment } from "react";function ListGroup() {return (<Fragment><h1>List group</h1><ul className="list-group"><li className="list-group-item">123</li><li className="list-group-item">321</li><li className="list-group-item">abc</li><li className="list-group-item">xyz</li></ul></Fragment>);
}export default ListGroup;

当然,你也可以直接使用空标签来使用碎片

<><h1>List group</h1><ul className="list-group"><li className="list-group-item">123</li><li className="list-group-item">321</li><li className="list-group-item">abc</li><li className="list-group-item">xyz</li></ul>
</>

标记内的动态渲染

在组件的返回中,作为标记无法使用其他 js 代码,因此需要通过用 {} 对标记进行动态渲染

import { Fragment } from "react";function ListGroup() {const cities = ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"];return (<Fragment><h1>List group</h1><ul className="list-group">{cities.map((city) => (<li className="list-item" key={city}>{city}</li>))}</ul></Fragment>);
}export default ListGroup;

或者,在返回前定义好需要显示的内容,避免对返回的标记的结构进行太大的破坏

import { Fragment } from "react";function ListGroup() {let cities = ["New York", "Los Angeles", "Chicago", "Houston", "Phoenix"];cities = [];const message = cities.length === 0 ? "No cities found" : null;return (<Fragment><h1>List group</h1>{message}<ul className="list-group">{cities.map((city) => (<li className="list-item" key={city}>{city}</li>))}</ul></Fragment>);
}export default ListGroup;

或者,你可以使用逻辑符号

cities.length === 0 && <p>No city found</p>

当前者条件为真时,将会返回第二个元素

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

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

相关文章

OpenCV CUDA模块设备层-----“小于阈值设为零” 的图像处理函数thresh_to_zero_func()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV CUDA 模块&#xff08;cudev&#xff09; 中的一个仿函数生成器&#xff0c;用于创建一个 “小于阈值设为零” 的图像处理函数对象。 这个函…

数字图像处理学习笔记

1-图像处理基础_哔哩哔哩_bilibili 输出图像像素点需要将图象值要作类型转换&#xff0c;转成Int 图像仿射变换 线性变换平移 线性变换&#xff1a; 1&#xff0c;变换前直线&#xff0c;变换后仍然直线 2&#xff0c;直线比例不变 3&#xff0c;直线到远点的距离不变 仿射变…

用systemd管理GreatSQL服务详解

用systemd管理GreatSQL服务详解 1.GreatSQL服务文件 官网 greatsql.service 文件 [Unit] DescriptionGreatSQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Aftersyslog.target [Install] …

【AIGC】深度剖析AI伦理:强化隐私防线,推动算法公平性的核心议题

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC 文章目录 &#x1f34a;1 人工智能兴起背后的伦理及道德风险1.1 算法偏见与歧视1.2 数据隐私侵权1.3 透明度受限1.4 决策失衡1.5 AI生成内容的危险性 &#x1f34a;2 建构AIGC伦理观&#xff1a;实现人机共创的永…

WebSocket技术全面解析:从历史到实践

WebSocket技术全面解析&#xff1a;从历史到实践 WebSocket作为一种全双工通信协议&#xff0c;彻底改变了Web应用的实时交互模式。它于2011年被IETF正式标准化为RFC 6455&#xff0c;解决了传统HTTP协议在实时通信中的根本缺陷。本文将深入探讨WebSocket的发展历程、技术原理、…

单用户模式、紧急模式、救援模式有什么区别

文章目录 **一、单用户模式&#xff08;Single User Mode&#xff09;****功能与用途****启动特点****进入方式** **二、紧急模式&#xff08;Emergency Mode&#xff09;****功能与用途****启动特点****进入方式** **三、救援模式&#xff08;Rescue Mode&#xff09;****功能…

【大模型入门】访问GPT的API

目录 0 前言 免费访问GPT的API Windows下环境变量的设置 1 非流式输出 1.1 使用requests库 1.2 使用OpenAI库 2 流式输出 2.1 使用requests库 2.2 使用OpenAI库 3 使用OpenAI库与GPT聊天&#xff08;存储对话历史版&#xff09; 4 嵌入向量embeddings 4.1 创建嵌入向…

Jenkins 部署脚本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止旧进程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固态闪存NV196NV201

美光固态闪存技术深度解析&#xff1a;NV183、NV185、NV196与NV201系列 一、技术架构与核心参数对比 1. 制程工艺与容量布局 美光NV183/NV185/NV196/NV201系列采用176层3D NAND技术&#xff0c;通过垂直堆叠提升存储密度。其中&#xff1a; NV183&#xff1a;主打256GB容量段…

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓

基于单片机PWM控制逆变电源设计资料集&#xff1a;全面掌握逆变电源设计精髓 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子技术中&#xff0c;逆变电源的设计与应用占据了至关重要的位置。今天&#xff0c;我将为您介绍一个优秀的开源项目——基于单片…

Docker Buildx 构建多架构镜像(Redis、Mysql、Java8、Nginx)

目标 ARM64 麒麟电脑无法直接拉取 Redis 镜像&#xff0c;需在 Windows x86 电脑上通过 多架构构建工具&#xff08;如 Docker Buildx&#xff09; 生成适配 ARM64 的 Redis 镜像&#xff0c;再打包传输到目标设备。 一、核心问题&#xff1a;跨架构镜像兼容性 直接保存的 redi…

代理IP的安全陷阱:如何避免中间人攻击与IP池污染?

在跨境业务、数据采集等场景中&#xff0c;代理IP已成为刚需工具。然而&#xff0c;其隐藏的安全风险却常被忽视——轻则泄露隐私&#xff0c;重则导致账号封禁、数据劫持甚至金融损失。本文将深入剖析两大核心风险&#xff08;中间人攻击与IP池污染&#xff09;&#xff0c;并…

深入理解大语言模型中的超参数:Temperature、Top-p 与更多

随着大语言模型&#xff08;LLM&#xff09;如 GPT、Claude、Gemini 的广泛应用&#xff0c;调优生成文本的质量与风格成为开发者和研究人员的重要课题。其中&#xff0c;超参数&#xff08;Hyperparameters&#xff09;如 temperature 和 top_p 扮演了核心角色&#xff0c;影响…

译码器Multisim电路仿真汇总——硬件工程师笔记

目录 74LS实现二线三线译码器 1 74LS139D和74LS138D基础知识 1.1 74LS139D 二线四线译码器 1.1.1 功能特点 1.1.2 引脚功能 1.1.3 工作原理 1.1.4 应用场景 1.1.5 使用方法 1.1.6 注意事项 1.6.7 逻辑真值表 1.2 74LS138D 3线8线译码器 1.2.1 功能特点 1.2.2 引脚…

国产 OFD 标准公文软件数科 OFD 阅读器:OFD/PDF 双格式支持,公务办公必备

各位办公软件小达人们&#xff0c;今天咱来聊聊数科OFD阅读器&#xff01; 软件下载地址安装包 这软件啊&#xff0c;是基于咱国家自主OFD标准的版式阅读软件&#xff0c;主要用来阅读和处理OFD/PDF电子文件&#xff0c;还能用于公务应用扩展。它支持打开和浏览OFD/PDF格式的文…

vue中的toRef

在 Vue 中&#xff0c; toRef 函数用于将响应式对象的属性转换为一个独立的 ref 对象&#xff0c;同时保持与原始属性的关联。其参数格式及用法如下&#xff1a; toRef 的参数说明 1. 参数 1&#xff1a;源对象&#xff08;必须&#xff09; - 类型&#xff1a; Object &…

暖通锅炉的智能管控:物联网实现节能又舒适​

暖通锅炉系统在建筑供暖、工业供热等领域扮演着重要角色&#xff0c;其运行效率和能源消耗直接关系到用户的使用体验和成本支出。传统的暖通锅炉管理方式往往依赖人工操作和经验判断&#xff0c;存在能耗高、调节不灵活、舒适性差等问题。随着物联网技术的发展&#xff0c;暖通…

PHP:从入门到进阶的全面指南

PHP&#xff08;Hypertext Preprocessor&#xff09;作为一种广泛使用的开源脚本语言&#xff0c;尤其适用于 Web 开发并可嵌入 HTML 中。自诞生以来&#xff0c;PHP 凭借其简单易学、功能强大以及丰富的生态系统&#xff0c;成为了众多网站和 Web 应用程序开发的首选语言之一。…

EXCEL 基础函数

1、绝对引用、相对引用 1.1相对引用 相对引用&#xff0c;这是最常见的引用方式。复制单元格公式时&#xff0c;公式随着引用单元格的位置变化而变化 例如在单元格内输入sum(B2:C2)&#xff0c;然后下拉填充柄复制公式。 可以看到每个单元格的公式不会保持sum(B2:C2)&#…

升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN

在升级到MySQL 8.4后&#xff0c;许多用户在启动数据库时遇到了一种常见错误&#xff1a;“io_setup() failed with EAGAIN”。本文将深入探讨该错误的原因&#xff0c;并提供详细的解决方案。错误分析错误描述当你启动MySQL时&#xff0c;可能会在日志文件中看到以下错误信息&…