React 基本介紹與項目創建

為什么使用 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;可能會在日志文件中看到以下錯誤信息&…