學習 React【Plan - June - Week 1】

一、使用 JSX 書寫標簽語言

JSX 是一種 JavaScript 的語法擴展,React 使用它來描述用戶界面。


什么是 JSX?

  • JSX 是 JavaScript 的一種語法擴展。
  • 看起來像 HTML,但它實際上是在 JavaScript 代碼中寫 XML/HTML。
  • 瀏覽器并不能直接運行 JSX,需要通過打包工具(如 Babel)將其轉譯為 JavaScript。

示例:

const element = <h1>Hello, world!</h1>;

1、JSX 的基本規則

使用大寫字母定義組件

function MyButton() {return <button>I'm a button</button>;
}
  • 小寫字母開頭的標簽,如 <div> 被解析為 HTML 標簽。
  • 大寫字母開頭的標簽,如 <MyButton> 被解析為 React 組件。

必須使用閉合標簽

  • 所有標簽必須閉合(類似 XML 語法)
// 正確
<input />
<br />
<MyComponent />// 錯誤
<input>

使用 {} 插入 JavaScript 表達式

const user = "小明";
const element = <h1>Hello, {user}!</h1>;
  • 只能插入表達式(不是語句)

合法表達式:

{1 + 2}
{user.name}
{formatDate(date)}

非法語句:

{if (isTrue) { ... }}
{for (...) { ... }}

使用 className 代替 class

// HTML 寫法
<div class="container"></div>// JSX 寫法
<div className="container"></div>

因為 class 是 JavaScript 的關鍵字,所以要使用 className


使用 camelCase 的屬性名

// HTML 寫法
<input tabindex="0" onclick="handleClick()" />// JSX 寫法
<input tabIndex={0} onClick={handleClick} />

2、條件渲染和列表渲染

條件渲染

使用三元表達式、邏輯與 &&

{isLoggedIn ? <LogoutButton /> : <LoginButton />}{messages.length > 0 && <Notification messages={messages} />}

列表渲染

使用 map() 進行循環輸出,并為每個子元素設置唯一的 key

const items = ['A', 'B', 'C'];<ul>{items.map(item => <li key={item}>{item}</li>)}
</ul>

3、JSX 轉換成 JavaScript 的原理

JSX 會被轉譯為 React.createElement 調用:

const element = <h1 className="title">Hello</h1>;// 會被轉換為:
const element = React.createElement('h1', { className: 'title' }, 'Hello');

4、組合 JSX

JSX 支持嵌套結構:

function App() {return (<div><Header /><Content /><Footer /></div>);
}

可使用片段(Fragment)避免多余的 DOM 元素:

<><td>內容1</td><td>內容2</td>
</>

5、JSX Tips

注釋寫法:

{/* 這是注釋 */}

多行 JSX 需要用括號包裹:

return (<div><h1>Hello</h1></div>
);

二、組件(Component)

React 應用是由組件構成的,組件是可以復用的 UI 單元。


什么是組件?

  • 組件(Component) 是 React 的核心概念。
  • 本質上是一個返回 JSX 的函數。
  • 組件名稱必須以大寫字母開頭。

示例:

function MyButton() {return <button>I'm a button</button>;
}

在 JSX 中使用:

export default function MyApp() {return (<div><h1>Welcome to my app</h1><MyButton /></div>);
}

組件命名規則

  • 必須以大寫字母開頭,否則會被當成 HTML 標簽。
  • 使用 PascalCase 命名約定(每個單詞首字母大寫)。

1、組件是函數,不是標簽

function MyButton() {return <button>Click me</button>;
}

這個 MyButton 是一個函數,而 <MyButton /> 是它的使用方式(調用)


2、組件可以復用

你可以多次使用同一個組件,它們是互相獨立的:

function MyApp() {return (<div><MyButton /><MyButton /></div>);
}

每個 <MyButton /> 都會渲染一個獨立的按鈕。


3、組件的結構建議

建議為每個組件建一個文件(例如 MyButton.jsx),用于項目組織:

src/
├─ components/
│  └─ MyButton.jsx
└─ App.jsx

🧪 示例代碼匯總

// MyButton.jsx
export default function MyButton() {return <button>I'm a button</button>;
}// App.jsx
import MyButton from './MyButton';export default function MyApp() {return (<div><h1>Welcome to my app</h1><MyButton /><MyButton /></div>);
}

三、State

React 的狀態(state)允許組件“記住”信息。狀態是讓組件有“記憶”的機制,通常用于跟蹤用戶交互或界面變化。


1、什么是狀態(State)?

  • 狀態是組件的“記憶”
  • 在每次重新渲染時,組件的狀態保持不變
  • 狀態的變化會 觸發組件的重新渲染

2、如何添加狀態?

通過 useState Hook:

import { useState } from 'react';function MyComponent() {const [count, setCount] = useState(0);
}

useState 解釋:

const [state, setState] = useState(initialValue);
名稱含義
state當前狀態值
setState用于更新狀態的函數
initialValue初始狀態值

3、狀態的基本用法示例

import { useState } from 'react';export default function MyButton() {const [count, setCount] = useState(0);function handleClick() {setCount(count + 1);}return (<button onClick={handleClick}>Clicked {count} times</button>);
}

4、每次點擊發生了什么?

  1. 點擊按鈕時,handleClick 被調用。
  2. setCount(count + 1) 更新狀態。
  3. React 重新渲染組件。
  4. 新的 count 顯示在界面上。

狀態更新不會改變當前值,而是觸發一次新的渲染,組件中的 count 會更新為新值。


5、狀態在組件之間是隔離的

每個組件實例有自己獨立的狀態。

<MyButton />
<MyButton />

上面兩個按鈕互不影響,即使它們使用相同的 useState


6、不要直接修改 state 變量

// 錯誤寫法(不會觸發重新渲染)
count = count + 1;// 正確寫法
setCount(count + 1);

只有通過 setCount 這樣的更新函數,React 才會觸發重新渲染。


7、多個狀態變量

可以在一個組件中使用多個 useState

const [count, setCount] = useState(0);
const [name, setName] = useState('React');

8、示例完整代碼

import { useState } from 'react';function MyButton() {const [count, setCount] = useState(0);function handleClick() {setCount(count + 1);}return (<button onClick={handleClick}>Clicked {count} times</button>);
}export default function MyApp() {return (<div><h1>Welcome to my app</h1><MyButton /><MyButton /></div>);
}

四、響應事件

React 使用類似 HTML 的方式來處理用戶交互事件,比如點擊、輸入、懸停等。但語法略有不同,并支持更強的邏輯功能。


1、事件綁定基礎

React 使用 onClickonChange 等屬性來綁定事件處理函數。

示例:

function MyButton() {function handleClick() {alert('你點擊了我!');}return (<button onClick={handleClick}>點擊我</button>);
}

注意:

  • 使用駝峰命名(如 onClick,而不是 onclick
  • 事件處理函數是一個普通的 JavaScript 函數
  • JSX 中不使用字符串綁定函數(不同于 HTML 的 onclick="handleClick()"

2、為什么使用函數名而不是函數調用?

// 正確
onClick={handleClick}// 錯誤(會立即執行)
onClick={handleClick()}

你應傳遞函數的引用,而不是函數的執行結果。


3、使用箭頭函數傳參

有時你希望傳遞參數給事件處理函數,可以使用箭頭函數:

function handleClick(name) {alert(`Hello, ${name}!`);
}<button onClick={() => handleClick('小明')}>Say Hello
</button>

4、在組件中組合事件處理邏輯

React 鼓勵你將組件拆成小塊,事件處理函數可以在組件內部定義或向下傳遞:

function Button({ onClick, children }) {return <button onClick={onClick}>{children}</button>;
}function App() {function handleClick() {alert('Clicked!');}return (<div><Button onClick={handleClick}>按鈕1</Button><Button onClick={handleClick}>按鈕2</Button></div>);
}

5、常見事件類型

React 事件名對應 HTML說明
onClickonclick點擊事件
onChangeonchange輸入/選擇改變
onSubmitonsubmit表單提交
onMouseEnteronmouseenter鼠標進入
onKeyDownonkeydown按鍵按下

6、阻止默認行為

可以在事件中調用 event.preventDefault()

function handleSubmit(e) {e.preventDefault();alert('提交已阻止');
}<form onSubmit={handleSubmit}><button type="submit">提交</button>
</form>

7、React 與原生 DOM 事件的區別

項目React原生 HTML
命名方式駝峰命名,如 onClick小寫,如 onclick
傳遞方式傳函數引用傳字符串或函數調用
自動阻止冒泡否,你仍需手動阻止冒泡同樣需手動處理

8、示例完整代碼

function Button({ message, children }) {function handleClick() {alert(message);}return (<button onClick={handleClick}>{children}</button>);
}export default function App() {return (<div><Button message="你好!">點我</Button><Button message="再見!">再點我</Button></div>);
}

五、React 哲學

“React 哲學” 教你如何從 UI 設計圖開始,一步步將頁面拆解為組件,再構建出數據驅動的交互式界面。


示例場景簡介

我們要實現一個可搜索的商品表格(Searchable Product Table),它包含:

  • 一個搜索框
  • 一個是否只顯示有庫存商品的勾選框
  • 一個根據品類分組的商品表格

構建步驟總覽

React 官方建議采用 五步法

  1. 將 UI 拆解為組件層級結構
  2. 構建組件的靜態版本(無交互)
  3. 確定最小但完整的 UI 狀態表示
  4. 確定哪些組件擁有狀態(狀態提升)
  5. 添加反向數據流(處理用戶輸入)

1、第一步:將 UI 拆解為組件層級

觀察 UI,并根據界面結構拆出以下組件:

組件層級結構

FilterableProductTable (父組件)
├─ SearchBar
└─ ProductTable├─ ProductCategoryRow└─ ProductRow

每個組件的職責

組件名作用描述
FilterableProductTable管理所有狀態,整合其他組件
SearchBar輸入搜索文本與是否過濾庫存
ProductTable接收數據與過濾條件,渲染表格
ProductCategoryRow顯示每個品類的標題
ProductRow顯示單個商品

2、第二步:構建靜態版本(無交互)

  • 使用父組件 FilterableProductTable 將假數據通過 props 傳給子組件。
  • 每個組件只關注如何顯示數據,不包含狀態或交互。
  • 假數據示例:
const PRODUCTS = [{category: "Fruits", price: "$1", stocked: true, name: "Apple"},{category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit"},{category: "Fruits", price: "$2", stocked: false, name: "Passionfruit"},{category: "Vegetables", price: "$2", stocked: true, name: "Spinach"},{category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin"},{category: "Vegetables", price: "$1", stocked: true, name: "Peas"}
];

3、第三步:確定最小但完整的 UI 狀態(State)

根據界面交互功能,確定需要驅動 UI 的狀態

  • 搜索文本(filterText
  • 是否只顯示有庫存商品(inStockOnly

不是狀態的內容(可由 props 或其他狀態推導得出):

  • 商品數據(是靜態的)
  • 分類標題(可從數據中提取)
  • 篩選后的商品列表(由 filterText + inStockOnly 計算)

4、第四步:決定狀態的歸屬

狀態應該放在最“靠上的共同祖先組件”中。

狀態名所屬組件原因
filterTextFilterableProductTableSearchBar 和 ProductTable 都使用它
inStockOnlyFilterableProductTable同上

5、第五步:添加反向數據流(提升狀態 + 子傳父)

SearchBar 接收 filterTextinStockOnly 作為 props,并通過 onChange 回調將用戶輸入傳遞給父組件修改狀態。

function SearchBar({ filterText, inStockOnly, onFilterTextChange, onInStockChange }) {return (<form><inputtype="text"value={filterText}onChange={(e) => onFilterTextChange(e.target.value)}placeholder="Search..."/><label><inputtype="checkbox"checked={inStockOnly}onChange={(e) => onInStockChange(e.target.checked)}/>Only show products in stock</label></form>);
}

6、組件結構(最終)

<FilterableProductTable products={PRODUCTS} />// 內部包含└── <SearchBarfilterText={...}inStockOnly={...}onFilterTextChange={...}onInStockChange={...}/>└── <ProductTableproducts={...}filterText={...}inStockOnly={...}/>

學習資料來源

使用 JSX 書寫標簽語言
第一個組件
State
響應事件
React 哲學

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83118.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小智AI+MCP

什么是小智AI和MCP 如果還不清楚的先看往期文章 手搓小智AI聊天機器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下載官方MCP的示例代碼 Github&#xff1a;https://github.com/78/mcp-calculator 安這個步驟執行 其中MCP_ENDPOI…

基于python大數據的口紅商品分析與推薦系統

博主介紹&#xff1a;高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的設計程序開發&#xff0c;開發過上千套設計程序&#xff0c;沒有什么華麗的語言&#xff0c;只有實實在…

ArcPy擴展模塊的使用(3)

管理工程項目 arcpy.mp模塊允許用戶管理布局、地圖、報表、文件夾連接、視圖等工程項目。例如&#xff0c;可以更新、修復或替換圖層數據源&#xff0c;修改圖層的符號系統&#xff0c;甚至自動在線執行共享要托管在組織中的工程項。 以下代碼展示了如何更新圖層的數據源&…

打開GitHub網站因為網絡原因導致加載失敗問題解決方案

Date: 2025.06.09 20:34:22 author: lijianzhan 在Windows系統中&#xff0c;打開GitHub網站因為網絡原因導致加載失敗問題解決方案 打開Windows系統下方搜索框&#xff0c;搜索Microsoft Store&#xff0c;并且雙擊打開 在應用里面搜索Watt Toolkit&#xff0c;并下載安裝 …

AI代碼助手需求說明書架構

AI代碼助手需求說明書架構 #mermaid-svg-6dtAzH7HjD5rehlu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6dtAzH7HjD5rehlu .error-icon{fill:#552222;}#mermaid-svg-6dtAzH7HjD5rehlu .error-text{fill:#552222;s…

.NET開發主流框架全方位對比分析

文章目錄 1. ASP.NET Core核心特性代碼示例&#xff1a;基本控制器優勢劣勢 2. .NET MAUI核心特性代碼示例&#xff1a;基本頁面優勢劣勢 3. Blazor兩種托管模型核心特性代碼示例&#xff1a;計數器組件優勢劣勢 4. WPF (Windows Presentation Foundation)核心特性代碼示例&…

【系統架構設計師-2025上半年真題】案例分析-參考答案及部分詳解(回憶版)

更多內容請見: 備考系統架構設計師-專欄介紹和目錄 文章目錄 試題一(25分)【問題1】(12分)【問題2】(13分)試題二(25分)【問題1】(10分)【問題2】(6分)【問題3】(9分)試題三(25分)【問題1】(13分)【問題2】(8分)【問題3】(4分)試題四(25分)【問題1】(6分)【問題2】(12…

【中間件】Web服務、消息隊列、緩存與微服務治理:Nginx、Kafka、Redis、Nacos 詳解

Nginx 是什么&#xff1a;高性能的HTTP和反向代理Web服務器。怎么用&#xff1a;通過配置文件定義代理規則、負載均衡、靜態資源服務等。為什么用&#xff1a;提升Web服務性能、高并發處理、負載均衡和反向代理。優缺點&#xff1a;輕量高效&#xff0c;但動態處理能力較弱&am…

運動控制--小車的啟動和停止算法

一、現實問題 小車在啟動時由于受到慣性&#xff0c;后輪和前輪速度不一致&#xff0c;會引起車身不穩。 如小車上面裝的是水&#xff0c;會出現傾灑&#xff0c;體驗差。 二、數學研究 啟動時 停止時 急動度&#xff08;jerk) 三、BLDC控制與S型曲線的融合邏…

WebFuture:Ubuntu 系統上在線安裝.NET Core 8 的步驟

方法一&#xff1a;使用官方二進制包安裝 下載.NET Core 8 SDK 二進制包&#xff1a;訪問 .NET Core 8 SDK 官方下載頁面&#xff0c;根據你的系統架構選擇對應的 Linux x64 版本等下載鏈接&#xff0c;將其下載到本地4. 創建安裝目錄&#xff1a;在終端中執行以下命令創建用于…

可視化預警系統:如何實現生產風險的實時監控?

在生產環境中&#xff0c;風險無處不在&#xff0c;而傳統的監控方式往往只能事后補救&#xff0c;難以做到提前預警。但如今&#xff0c;可視化預警系統正在改變這一切&#xff01;它能夠實時收集和分析生產數據&#xff0c;通過直觀的圖表和警報&#xff0c;讓管理者第一時間…

深度解析 Linux 內核參數 net.ipv4.tcp_rmem:優化網絡性能的關鍵

文章目錄 引言一、認識 net.ipv4.tcp_rmem1. 最小值&#xff08;min&#xff09;2. 默認值&#xff08;default&#xff09;3. 最大值&#xff08;max&#xff09; 二、net.ipv4.tcp_rmem 的工作原理三、net.ipv4.tcp_rmem 的實際應用場景1. 高并發 Web 服務器2. 文件傳輸服務3…

Windmill:開源開發者基礎設施的革命者

前言 在企業內部,開發者經常需要構建各種內部工具來支持業務運營、數據分析和系統管理。這些工具通常需要前端界面、后端邏輯和工作流編排,開發過程繁瑣且耗時。今天要介紹的Windmill項目,正是為解決這一痛點而生,它讓構建內部工具變得簡單高效,堪稱開發者的得力助手。 …

國產化Excel處理組件Spire.XLS教程:用 Java 獲取所有 Excel 工作表名稱(圖文詳解)

在 Excel 中&#xff0c;工作表名稱通常能夠反映其用途或所含內容&#xff0c;提取這些名稱有助于理清整個工作簿的結構。對于新用戶或協作者來說&#xff0c;僅憑這些名稱就能快速掌握各表中的數據類型。本文將演示如何使用 Java 獲取 Excel 文件中的所有工作表名稱&#xff0…

day49python打卡

知識點回顧&#xff1a; 通道注意力模塊復習空間注意力模塊CBAM的定義 最近臨近畢業&#xff0c;事情有點多。如果有之前的基礎的話&#xff0c;今天的難度相對較低。 后面說完幾種模塊提取特征的組合方式后&#xff0c;會提供整理的開源模塊的文件。 現在大家已近可以去讀這類…

day27-shell編程(自動化)

1. 準備工具 添加到/etc/vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle() if expand("%:e") ~ sh\|bash call setline(1,"#!/bin/bash")call setline(2, &quo…

【免殺】C2免殺技術(十五)shellcode混淆uuid/ipv6/mac

針對 shellcode 混淆(Shellcode Obfuscation) 的實戰手段還有很多,如下表所示: 類型舉例目的編碼 / 加密XOR、AES、RC4、Base64、Poly1305、UUID、IP/MAC改變字節特征,避開靜態簽名或 YARA結構偽裝PE Stub、GIF/PNG 嵌入、RTF OLE、UUID、IP/MAC看起來像合法文件/數據,弱…

Vite中定義@軟鏈接

在webpack中可以直接通過符號表示src路徑&#xff0c;但是vite中默認不可以。 如何實現&#xff1a; vite中提供了resolve.alias&#xff1a;通過別名在指向一個具體的路徑 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…

記錄一次opengl顯示不出物體的錯誤原因

是這樣的&#xff0c;我打算學PBR中的IBL章節&#xff0c;即基于圖像的渲染&#xff0c;它的觀點是創建一個大的外景圖片&#xff0c;可以根據圖像中的信息來將環境中的漫反射光和鏡面反射光打在物體上。 但是我在我的程序中創建了一個立方體作為天空盒&#xff0c;我是有兩套…

國產錄播一體機:科技賦能智慧教育信息化

在數字化時代&#xff0c;教育正經歷著前所未有的變革。國產工控機作為信息化教育的核心載體&#xff0c;正在重新定義學習方式&#xff0c;賦能教師與學生&#xff0c;打造高效、互動、智能的教學環境&#xff0c;讓我們一起感受科技與教育的深度融合&#xff01;高能計算機推…