React JSX語法介紹(JS XML)(一種JS語法擴展,允許在JS代碼中編寫類似HTML的標記語言)Babel編譯

在線調試網站:https://zh-hans.react.dev/learn

文章目錄

  • JSX:現代前端開發的聲明式語法
    • 概述
    • JSX的本質與工作原理
      • 什么是JSX
      • JSX轉換流程
    • JSX語法特性
      • 表達式嵌入(JSX允許在大括號內嵌入任何有效的JavaScript表達式)
      • 屬性傳遞(JSX中的屬性傳遞遵循特定的規則)
      • 條件渲染(JSX支持多種條件渲染模式)
      • 列表渲染(使用map方法渲染數組數據)
    • JSX與傳統HTML的區別
      • 屬性命名差異
      • 事件處理差異
    • JSX的優勢
      • 聲明式編程
      • 組件化開發
    • JSX編譯過程
      • Babel轉換示例
      • 編譯配置
    • 最佳實踐
      • 組件結構規范
      • 性能優化技巧
    • 常見問題與解決方案
      • Key屬性的重要性
      • 事件處理中的this綁定
    • 總結

JSX:現代前端開發的聲明式語法

概述

JSX(JavaScript XML)是Facebook開發的一種JavaScript語法擴展,它允許在JavaScript代碼中編寫類似HTML的標記語言。作為React生態系統的核心組成部分,JSX為開發者提供了一種更直觀、更聲明式的方式來描述用戶界面。

JSX的本質與工作原理

什么是JSX

JSX本質上是一種語法糖,它將類HTML的語法轉換為JavaScript函數調用。當編寫JSX代碼時,實際上是在創建React元素的描述,這些描述最終會被轉換為虛擬DOM。

// JSX語法(我們寫React時需要編寫的代碼,這種代碼瀏覽器無法識別,需要通過Babel編譯)
const element = <h1 className="greeting">Hello, World!</h1>;// 轉換后的JavaScript(經過Babel編譯)
const element = React.createElement('h1',                    // 元素類型{ className: 'greeting' }, // 屬性對象'Hello, World!'          // 子元素內容
);

JSX轉換流程

JSX源代碼<人寫>
Babel編譯器
React.createElement調用
虛擬DOM對象
React渲染引擎
真實DOM

JSX語法特性

表達式嵌入(JSX允許在大括號內嵌入任何有效的JavaScript表達式)

// 變量嵌入
const name = "React開發者";
const greeting = <h1>歡迎, {name}!</h1>;// 函數調用
function formatName(user) {return user.firstName + ' ' + user.lastName; // 拼接用戶姓名
}const user = {firstName: '張',  // 用戶姓lastName: '三'    // 用戶名
};const element = (<h1>Hello, {formatName(user)}!  {/* 調用函數并顯示結果 */}</h1>
);// 主應用組件
export default function MyApp() {return (<div><h1>歡迎來到我的應用</h1>{/* 使用 element 變量 */}{element}</div>);
}

在這里插入圖片描述

屬性傳遞(JSX中的屬性傳遞遵循特定的規則)

參考文章:React JSX屬性傳遞規則(事件處理函數名必須用駝峰式;內聯樣式必須是JavaScript對象,鍵名用駝峰命名;className、htmlFor;自定義屬性要以data-開頭、動態屬性綁定)

// 字符串屬性
const element1 = <div className="container">內容</div>;// 表達式屬性
const isActive = true;                    // 定義狀態變量
const className = isActive ? 'active' : 'inactive'; // 根據狀態確定樣式類名const element2 = (<button className={className}                 // 動態classNameonClick={() => console.log('點擊')}   // 事件處理函數disabled={!isActive}                  // 動態禁用狀態>按鈕文字</button>
);// 主應用組件
export default function MyApp() {return (<div><h1>歡迎來到我的應用</h1>{/* 使用 element1 變量 */}{element1}{/* 使用 element2 變量 */}{element2}</div>);
}

在這里插入圖片描述

條件渲染(JSX支持多種條件渲染模式)

// 用戶問候組件
function UserGreeting({ isLoggedIn, user, logout }) {// 使用三元運算符進行條件渲染return (<div>{isLoggedIn ? (                     // 如果已登錄<h1>歡迎回來, {user.name}!</h1>   // 顯示歡迎信息) : (                              // 如果未登錄<h1>請先登錄</h1>                // 顯示登錄提示)}{/* 使用邏輯AND運算符 */}{isLoggedIn && (                   // 只有登錄時才顯示<button onClick={logout}>退出</button>)}</div>);
}// 主應用組件
export default function MyApp() {const isActive = true;                 // 登錄狀態const user = { name: "用戶" };         // 用戶信息const logout = () => console.log("退出登錄"); // 退出登錄函數return (<div>{/* 使用 UserGreeting 組件 */}<UserGreeting isLoggedIn={isActive}            // 傳遞登錄狀態user={user}                      // 傳遞用戶信息logout={logout}                  // 傳遞退出函數/></div>);
}

在這里插入圖片描述

列表渲染(使用map方法渲染數組數據)

import React from 'react';// TodoList 組件
function TodoList({ todos, toggleTodo }) {return (<ul>{todos.map((todo) => (            // 遍歷待辦事項數組<li key={todo.id}                 // 為每個元素提供唯一keyclassName={todo.completed ? 'completed' : ''} // 根據完成狀態設置樣式><span>{todo.text}</span>      {/* 顯示任務內容 */}<button onClick={() => toggleTodo(todo.id)} // 切換完成狀態的處理函數>{todo.completed ? '撤銷' : '完成'} {/* 根據狀態顯示按鈕文字 */}</button></li>))}</ul>);
}// 主應用組件
export default function MyApp() {// 使用 useState 管理待辦事項狀態const [todos, setTodos] = React.useState([{ id: 1, text: '學習 React', completed: false },{ id: 2, text: '寫代碼練習', completed: true },{ id: 3, text: '閱讀文檔', completed: false }]);// 處理待辦項狀態切換const toggleTodo = (id) => {setTodos(todos.map(todo =>todo.id === id ? { ...todo, completed: !todo.completed } : todo));};return (<div><h2>待辦事項</h2>{/* 使用 TodoList 組件并傳遞必要 props */}<TodoList todos={todos}         // 傳遞待辦事項數組toggleTodo={toggleTodo} // 傳遞狀態切換函數/></div>);
}

在這里插入圖片描述

JSX與傳統HTML的區別

屬性命名差異

HTML屬性JSX屬性說明
classclassName避免與JavaScript關鍵字沖突
forhtmlFor避免與for循環關鍵字沖突
tabindextabIndex采用駝峰命名法

事件處理差異

// HTML方式
// <button onclick="handleClick()">點擊</button>// JSX方式
function MyComponent() {const handleClick = () => {           // 定義事件處理函數console.log('按鈕被點擊了');        // 輸出點擊日志};return (<button onClick={handleClick}>      {/* 使用駝峰命名的事件屬性 */}點擊</button>);
}

JSX的優勢

聲明式編程

JSX采用聲明式編程范式,開發者只需要描述界面應該是什么樣子,而不需要關心如何操作DOM:

// 聲明式:描述最終狀態
function Counter() {const [count, setCount] = useState(0); // 狀態管理Hookreturn (<div><p>當前計數: {count}</p>           {/* 顯示當前計數值 */}<button onClick={() => setCount(count + 1)} // 點擊時增加計數>增加</button></div>);
}

組件化開發

JSX天然支持組件化開發模式:

// 可復用的按鈕組件
function Button({ children, variant = 'primary', onClick }) {// 根據variant構建樣式類名// `btn` 是基礎樣式類名(定義按鈕基本樣式)// `btn-${variant}` 是動態樣式類名(根據傳入的variant參數變化)// 比如當 variant="primary" 時,最終類名是 "btn btn-primary"const className = `btn btn-${variant}`;  return (<button className={className}              // 應用樣式類onClick={onClick}                  // 綁定點擊事件>{children}                         {/* 渲染子元素 */}</button>);
}// 使用組件
function App() {return (<div>{/* 主要按鈕示例 */}<Button variant="primary" onClick={() => alert('主要按鈕')}>主要按鈕                         {/* 作為children傳遞 */}</Button>{/* 次要按鈕示例 */}<Button variant="secondary" onClick={() => alert('次要按鈕')}>次要按鈕</Button></div>);
}

JSX編譯過程

Babel轉換示例

// 原始JSX代碼
const element = (<div className="container"><h1>標題</h1><p>段落內容</p></div>
);// Babel編譯后的代碼
const element = React.createElement("div",                                // 元素類型{ className: "container" },          // 屬性對象React.createElement("h1", null, "標題"), // 第一個子元素React.createElement("p", null, "段落內容") // 第二個子元素
);

編譯配置

現代構建工具中的JSX配置:

// Babel配置 (.babelrc)
{"presets": ["@babel/preset-react"               // React預設,包含JSX轉換],"plugins": ["@babel/plugin-transform-react-jsx" // JSX轉換插件]
}

最佳實踐

組件結構規范

// 推薦的組件結構
function UserCard({ user, onEdit, onDelete }) {// 1. 狀態和副作用Hookconst [isEditing, setIsEditing] = useState(false);// 2. 事件處理函數const handleEditClick = () => {       // 編輯按鈕點擊處理setIsEditing(true);                 // 進入編輯模式onEdit(user.id);                    // 調用父組件傳入的編輯回調};const handleDeleteClick = () => {     // 刪除按鈕點擊處理if (window.confirm('確定要刪除嗎?')) { // 確認刪除操作onDelete(user.id);                // 調用刪除回調}};// 3. 渲染邏輯return (<div className="user-card"><img src={user.avatar} alt={user.name} /> {/* 用戶頭像 */}<h3>{user.name}</h3>              {/* 用戶姓名 */}<p>{user.email}</p>               {/* 用戶郵箱 */}<div className="actions"><button onClick={handleEditClick}>編輯</button><button onClick={handleDeleteClick}>刪除</button></div></div>);
}

性能優化技巧

// 使用React.memo進行組件優化
const MemoizedUserCard = React.memo(UserCard, (prevProps, nextProps) => {// 自定義比較函數,只有user對象變化時才重新渲染return prevProps.user.id === nextProps.user.id &&prevProps.user.name === nextProps.user.name;
});// 使用useCallback優化事件處理函數
function UserList({ users, onUserUpdate }) {const handleUserEdit = useCallback((userId) => {// 編輯邏輯,使用useCallback避免子組件不必要的重渲染onUserUpdate(userId);}, [onUserUpdate]);                   // 依賴數組return (<div>{users.map(user => (<MemoizedUserCard key={user.id}                 // 穩定的key值user={user}onEdit={handleUserEdit}       // 優化后的回調函數/>))}</div>);
}

常見問題與解決方案

Key屬性的重要性

// 錯誤示例:缺少key或使用不穩定的key
function BadList({ items }) {return (<ul>{items.map((item, index) => (<li key={index}>              {/* 使用index作為key是不推薦的 */}{item.name}</li>))}</ul>);
}// 正確示例:使用穩定唯一的key
function GoodList({ items }) {return (<ul>{items.map((item) => (<li key={item.id}>            {/* 使用唯一ID作為key */}{item.name}</li>))}</ul>);
}

事件處理中的this綁定

// 類組件中的事件綁定
class MyComponent extends React.Component {constructor(props) {super(props);this.state = { count: 0 };// 方法1:在構造函數中綁定this.handleClick = this.handleClick.bind(this);}// 方法2:使用箭頭函數handleClick = () => {this.setState({ count: this.state.count + 1 });};render() {return (<button onClick={this.handleClick}>  {/* 正確綁定的事件處理器 */}計數: {this.state.count}</button>);}
}

總結

JSX作為React生態系統的核心語法擴展,通過其聲明式的特性和強大的表達能力,大大簡化了前端開發的復雜度。它不僅提供了直觀的組件編寫方式,還通過編譯時優化確保了運行時的高效性能。

理解JSX的工作原理和最佳實踐,對于掌握現代React開發至關重要。隨著前端生態的不斷發展,JSX的應用場景也在不斷擴展,從傳統的Web應用到React Native移動開發,JSX都展現出了其強大的適應性和實用性。

通過合理運用JSX的各種特性,開發者能夠構建出更加優雅、可維護的用戶界面,這正是JSX在現代前端開發中不可替代的價值所在。

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

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

相關文章

Unity UI系統中RectTransform詳解

一、基礎代碼示例 public GameObject node; var rect node.GetComponent<RectTransform>();Debug.Log($"anchoredPosition----{rect.anchoredPosition}"); Debug.Log($"offsetMin.x--{rect.offsetMin}"); Debug.Log($"offsetMax.x--{rect.of…

【數據庫】并發控制

并發控制 在數據庫系統&#xff0c;經常需要多個用戶同時使用。同一時間并發的事務可達數百個&#xff0c;這就是并發引入的必要性。 常見的并發系統有三種&#xff1a; 串行事務執行&#xff08;X&#xff09;&#xff0c;每個時刻只有一個事務運行&#xff0c;不能充分利用…

我們來學mysql -- “數據備份還原”sh腳本

數據備份&還原 說明執行db_backup_cover.sh腳本 說明 環境準備&#xff1a;來源數據庫(服務器A)&#xff1b;目標數據庫(服務器B)dbInfo.sh腳本記錄基本信息 來源庫、目標庫的ip、port及執行路徑 # MySQL 客戶端和 mysqldump 的路徑 MYSQL_CLIENT"/work/oracle/mysql…

【NLP 78、手搓Transformer模型結構】

你以為走不出的淤泥&#xff0c;也遲早會云淡風輕 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》這篇論文可以說是自然語言處理領域的一座里程碑&#xff0c;它提出的 Transformer 結構帶來了一場技術革命。 研究背景與目標 在 Transfo…

深入理解CSS常規流布局

引言 在網頁設計中&#xff0c;理解元素如何排列和相互作用至關重要。CSS提供了三種主要的布局方式&#xff1a;常規流、浮動和定位。本文將重點探討最基礎也是最常用的常規流布局&#xff08;Normal Flow&#xff09;&#xff0c;幫助開發者掌握頁面布局的核心機制。 什么是…

樹結構詳細介紹(javascript版)

樹結構的基本概念 樹是一種非線性數據結構&#xff0c;由節點和連接節點的邊組成。與線性數據結構&#xff08;如數組、鏈表&#xff09;不同&#xff0c;樹具有層次結構&#xff0c;非常適合表示有層次關系的數據。 樹的基本術語 節點 (Node)&#xff1a; 樹中的基本單元&a…

element-plus bug整理

1.el-table嵌入el-image標簽預覽時&#xff0c;顯示錯亂 解決&#xff1a;添加preview-teleported屬性 <el-table-column label"等級圖標" align"center" prop"icon" min-width"80"><template #default"scope"&g…

RabbitMQ和MQTT區別與應用

RabbitMQ與MQTT深度解析&#xff1a;協議、代理、差異與應用場景 I. 引言 消息隊列與物聯網通信的重要性 在現代分布式系統和物聯網&#xff08;IoT&#xff09;生態中&#xff0c;高效、可靠的通信機制是構建穩健、可擴展應用的核心。消息隊列&#xff08;Message Queues&am…

零基礎遠程連接課題組Linux服務器,安裝anaconda,配置python環境(換源),在服務器上運行python代碼【3/3 適合小白,步驟詳細!!!】

遠程連接服務器 請查閱之前的博客——零基礎遠程連接課題組Linux服務器&#xff0c;安裝anaconda&#xff0c;配置python環境&#xff08;換源&#xff09;&#xff0c;在服務器上運行python代碼【1/3 適合小白&#xff0c;步驟詳細&#xff01;&#xff01;&#xff01;】&am…

Redis最佳實踐——安全與穩定性保障之訪問控制詳解

Redis 在電商應用的安全與穩定性保障之訪問控制全面詳解 一、安全訪問控制體系架構 1. 多層級防護體系 #mermaid-svg-jpkDj2nKxCq9AXIW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jpkDj2nKxCq9AXIW .error-ico…

vue2源碼解析——響應式原理

文章目錄 引言數據劫持收集依賴數組處理渲染watchervue3中的響應式 引言 vue的設計思想是數據雙向綁定、數據與UI自動同步&#xff0c;即數據驅動視圖。 為什么會這樣呢&#xff1f;這就不得不提vue的響應式原理了&#xff0c;在使用vue的過程中&#xff0c;我被vue的響應式設…

gcc相關內容

gcc 介紹&#xff1a;linux就是由gcc編譯出來的&#xff0c;而且好像之前Linux只支持gcc編譯。gcc全稱為gnu compiler collection&#xff0c;它是gnu項目的一個組成部分。gnu致力于創建一個完全自由的操作系統&#xff0c;我感覺意思就是完全開源的操作系統。gnu有很多組件和…

android 圖片背景毛玻璃效果實現

圖片背景毛玻璃效果實現 1 依賴 // Glide implementation("com.github.bumptech.glide:glide:4.16.0") kapt("com.github.bumptech.glide:compiler:4.16.0") implementation("jp.wasabeef:glide-transformations:4.3.0") 2 布局<com.googl…

【Java開發日記】你會不會5種牛犇的yml文件讀取方式?

前言 除了爛大街的Value和ConfigurationProperties外&#xff0c;還能夠通過哪些方式&#xff0c;來讀取yml配置文件的內容&#xff1f; 1、Environment 在Spring中有一個類Environment&#xff0c;它可以被認為是當前應用程序正在運行的環境&#xff0c;它繼承了PropertyReso…

Spring Boot事務失效場景及解決方案

事務失效場景1&#xff1a;方法非public修飾 原因 Spring事務基于動態代理&#xff08;AOP&#xff09;實現&#xff0c;非public方法無法被代理攔截&#xff0c;導致事務失效。 代碼示例 Service public class OrderService {Transactionalprivate void createOrder() { //…

電子電路:怎么理解時鐘脈沖上升沿這句話?

時鐘脈沖是數字電路中用于同步各組件操作的周期性信號&#xff0c;通常表現為高低電平交替的方波。理解其關鍵點如下&#xff1a; 時鐘脈沖的本質&#xff1a; 由晶振等元件生成&#xff0c;呈現0/1&#xff08;低/高電平&#xff09;的規律振蕩每個周期包含上升沿→高電平→下…

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx實戰

docker部署redis mysql nacos seata rabbitmq minio onlyoffice nginx實戰 一、環境介紹 操作系統&#xff1a;ubuntu22.04 軟件環境&#xff1a;docker、docker-compose 二、docker安裝 版本規定到26.1.3版本過低會引起莫名其妙的問題。打開終端。更新軟件包列表&#x…

全面解析:npm 命令、package.json 結構與 Vite 詳解

全面解析&#xff1a;npm 命令、package.json 結構與 Vite 詳解 一、npm run dev 和 npm run build 命令解析 1. npm run dev 作用&#xff1a;啟動開發服務器&#xff0c;用于本地開發原理&#xff1a; 啟動 Vite 開發服務器提供實時熱更新&#xff08;HMR&#xff09;功能…

【Oracle】TCL語言

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. TCL概述1.1 什么是TCL&#xff1f;1.2 TCL的核心功能 2. 事務基礎概念2.1 事務的ACID特性2.2 事務的生命周期 3. COMMIT語句詳解3.1 COMMIT基礎語法3.2 自動提交與手動提交3.3 提交性能優化 4. ROLLBACK語句…

OpenCV CUDA模塊直方圖計算------用于在 GPU 上執行對比度受限的自適應直方圖均衡類cv::cuda::CLAHE

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::CLAHE 是 OpenCV 的 CUDA 模塊中提供的一個類&#xff0c;用于在 GPU 上執行對比度受限的自適應直方圖均衡&#xff08;Contrast Limi…