React 中 props 的最常用用法精選+useContext

? React 最常用 props 用法 10 例


? 1. 傳遞字符串 / 數字 / 布爾值

function UserCard({ name, age, isVip }) {return (<div>{name} - {age} - {isVip ? 'VIP' : '普通用戶'}</div>);
}<UserCard name="張三" age={18} isVip={true} />

? 2. 傳遞函數(事件)

function Button({ onClick }) {return <button onClick={onClick}>點我</button>;
}<Button onClick={() => alert('你好!')} />

? 3. 傳遞 children(嵌套內容)

function Layout({ children }) {return <div className="layout">{children}</div>;
}<Layout><p>這是頁面內容</p>
</Layout>

? 4. 解構 props

function Welcome({ name }) {return <h1>歡迎 {name}</h1>;
}

? 5. 設置默認值

function Title({ text = "默認標題" }) {return <h2>{text}</h2>;
}<Title /> // 顯示“默認標題”

? 6. 傳遞數組 / 對象

function List({ items }) {return <ul>{items.map(item => <li key={item}>{item}</li>)}</ul>;
}<List items={['蘋果', '香蕉']} />

? 7. props 展開傳遞(...props)

function Input(props) {return <input {...props} />;
}<Input type="text" placeholder="請輸入..." />

? 8. props 類型校驗(開發時用)

import PropTypes from 'prop-types';function User({ name }) {return <div>{name}</div>;
}User.propTypes = {name: PropTypes.string.isRequired,
};

? 9. 使用函數+參數(如事件傳參)

function Item({ id, onDelete }) {return <button onClick={() => onDelete(id)}>刪除</button>;
}<Item id={1} onDelete={(id) => console.log('刪除', id)} />

? 10. 父傳子 + 子組件回調

function Child({ onLogin }) {return <button onClick={onLogin}>登錄</button>;
}function Parent() {const handleLogin = () => console.log("登錄成功!");return <Child onLogin={handleLogin} />;
}

? 補充:ref 轉發(略高階)

const Input = React.forwardRef((props, ref) => (<input ref={ref} {...props} />
));function App() {const ref = React.useRef();return (<><Input ref={ref} /><button onClick={() => ref.current.focus()}>聚焦</button></>);
}

? 小結:最常見的 props 類型

類型用途示例
string展示文字內容title="標題"
number計數、評分等count={5}
boolean控制顯示/開關isOpen={true}
function綁定事件onClick={() => {}}
children嵌套組件內容<Comp>內容</Comp>
array列表/選項items={[1, 2, 3]}
object配置項、用戶信息等user={{ name: '張三' }}
...props展開傳遞給 HTML 元素<button {...props}>按鈕</button>

useContext —— 它是 React 中用于跨組件傳遞數據的一個非常重要的方式,屬于“替代 props 多層傳遞”的方案。

useContext 和 props 的關系、區別、使用場景與完整例子,并結合 props 的理解一并講清楚。


? React 中 useContext 與 props 的配合與區別


🔍 一句話理解

  • props:父 → 子逐層傳遞,顯式、靈活但繁瑣。

  • context + useContext:全局/跨層傳遞,適合狀態共享,如主題、語言、用戶登錄信息等。


? 1. useContext 基本使用步驟

🔧 第一步:創建 Context

import { createContext } from "react";const UserContext = createContext(null);

🔧 第二步:提供 Provider,在頂層注入值

function App() {return (<UserContext.Provider value={{ name: "張三", isVip: true }}><Page /></UserContext.Provider>);
}

🔧 第三步:在任意子組件中使用 useContext 獲取值

import { useContext } from "react";function Page() {const user = useContext(UserContext);return <div>你好,{user.name},VIP:{user.isVip ? "是" : "否"}</div>;
}

? 2. useContext vs props:區別對比

項目propsuseContext
數據傳遞方式父組件手動一層一層傳遞提供一次,全局可用
靈活性更靈活,每個組件單獨定義更全局,統一管理
代碼復雜度嵌套層級多時變復雜跨層更簡單,避免“prop drilling”
場景大多數局部傳值場景全局狀態,如登錄用戶、主題、權限、多語言等
性能影響精細控制每一層渲染變更會導致所有消費組件重新渲染(需 memo 優化)

? 3. useContext + props 混用

const ThemeContext = createContext("light");function Button({ label }) {const theme = useContext(ThemeContext);return <button className={`btn-${theme}`}>{label}</button>;
}function App() {return (<ThemeContext.Provider value="dark"><Button label="點擊我" /></ThemeContext.Provider>);
}
  • label 是 props 傳遞的內容

  • theme 是 context 提供的“全局數據”

二者結合用是常見寫法。


? 4. useContext + props 高級配合場景舉例

示例:顯示用戶名稱并支持外部傳遞自定義 greeting

const UserContext = createContext({ name: "匿名用戶" });function Welcome({ greeting = "你好" }) {const user = useContext(UserContext);return <h1>{greeting},{user.name}</h1>;
}function App() {return (<UserContext.Provider value={{ name: "小紅" }}><Welcome greeting="歡迎回來" /></UserContext.Provider>);
}

? 5. 注意事項

  • 不推薦把所有數據都放在 context 中,會導致過度渲染。

  • 用 context 的時候,推薦拆小組件 + memo 優化

  • 可以結合 useReducer + useContext 實現簡易狀態管理(類 Redux)。


? 總結一下

方式說明
props用于組件直接傳遞數據,一層層傳
useContext用于全局或跨層組件數據共享(主題/用戶/語言)
混合使用最常見寫法:context 提供環境,props 控制行為

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

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

相關文章

離散型制造企業的可視化破局:設備OEE動態看板與工藝路徑模擬實踐

內容摘要離散型制造企業面臨著設備效率低下、生產過程不透明、工藝路徑復雜等諸多挑戰。如何通過可視化手段提升設備效率和生產透明度&#xff0c;成為企業亟待解決的問題。設備整體效率&#xff08;OEE&#xff09;動態看板和工藝路徑模擬是兩個關鍵的可視化工具&#xff0c;能…

在Tailwind Css中如何書寫flex布局

僅供參考 文章目錄一、啟用 flex 布局二、行內 flex 布局三、方向控制四、對齊方式五、子元素控制1、控制子元素的寬度是否可伸縮2、控制子元素順序3、控制子元素間的間隙4、控制子元素是否可換行顯示一、啟用 flex 布局 設置 class“flex” 啟用 flex 布局 <template>…

交通出行大前端與 AI 融合:智能導航與出行預測

交通出行類大前端應用&#xff08;導航APP、打車軟件、公交地鐵小程序等&#xff09;是連接用戶與出行服務的核心載體&#xff0c;其核心價值在于“高效規劃路徑、精準規避擁堵、適配個性化需求”。傳統導航依賴固定規則&#xff08;如“最短路徑優先”&#xff09;和歷史數據&…

csc(x)積分推導

在MATLAB中同時繪制 sin?(x), csc(x) 和 ln?∣tan?(x/2)∣的函數圖像&#xff0c;需要處理函數的奇點&#xff08;如 csc?(x) 在 sin?(x)0 時無定義&#xff0c;ln?∣tan?(x/2)∣ 在 xkπ 時無定義&#xff09;&#xff08;deepseek生成matlab代碼&#xff09;% 定義x范…

rtsp協議之.c++實現,rtsp,rtp協議框架,模擬多路音視頻h264,265,aac,數據幀傳輸,接收(二)

rtsp協議之.c實現&#xff0c;rtsp&#xff0c;rtp協議框架&#xff0c;模擬多路音視頻h264&#xff0c;265&#xff0c;aac&#xff0c;數據幀傳輸&#xff0c;接收&#xff08;二&#xff09; 1、RTSP 服務器核心&#xff1a;處理 RTSP 會話管理、請求解析和響應生成 2、媒體…

網絡性能與應用性能的協同優化研究:基于小波變換與CNN的圖像分類系統

網絡性能與應用性能的協同優化研究&#xff1a;基于小波變換與CNN的圖像分類系統 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 摘要 本文研究了網絡性能&#xff08;延遲、帶寬、丟…

【網絡安全領域】CTF競賽指南:賽事詳解、熱門平臺與信息獲取方式

CTF&#xff08;Capture The Flag&#xff09;&#xff0c;中文稱為奪旗賽&#xff0c;是網絡安全領域中一種備受關注和歡迎的競賽形式。以下是關于 CTF 競賽的詳細介紹&#xff0c;以及一些參賽平臺和相關咨詢途徑&#xff1a; CTF 競賽詳解 起源&#xff1a;CTF 起源于 199…

進程(以及系統調用和庫函數概念)

計算機管理硬件&#xff1a;先去組織起來再去描述起來&#xff08;類比先去組織小組&#xff0c;再去詳細描述工作&#xff09;系統調用和庫函數概念&#xff1a;系統就像是銀行&#xff0c;會去防著我們&#xff0c;但是會釋放一些接口用于我們使用&#xff0c;這個就是叫做系…

linux + 寶塔面板 部署 django網站 啟動方式:uwsgi 和gunicorn如何選擇 ?

啟動方式:uwsgi 和gunicorn如何選擇 ? 項目uWSGIGunicorn協議uWSGI 協議&#xff08;可用 HTTP/socket&#xff09;HTTP 協議啟動方式命令或 .ini 配置文件命令參數或 systemd 配置兼容框架支持 WSGI、uWSGI、FastCGI 等僅支持 WSGI性能高性能、極可調高性能、默認參數也夠用配…

基于有監督學習的主動攻擊檢測系統

核心功能&#xff1a;登錄注冊功能主儀表板功能&#xff1a;實時展示檢測結果和圖表分析&#xff0c;模型準確率、攻擊次數等。數據管理功能&#xff1a;加載訓練數據、預處理數據&#xff08;使用開源KDD數據集做為模型訓練數據)。模型訓練功能&#xff1a;支持隨機森林、支持…

simulink系列之模型接口表生成及自動連線腳本

總目錄 simulink系列之汽車應用層信號處理 第一章 simulink信號處理——debounce 第二章 simulink接口表生成及自動連線腳本 目錄 前言 一、simulink接口表生成腳本 1.使用方法&#xff1a; 二、模型整理連線腳本 1.使用方法&#xff1a; 總結 前言 本系列主要圍繞作者采用si…

Eureka+LoadBalancer實現服務注冊與發現

目錄 一、相關文章 二、兼容說明 三、服務注冊到EurekaServer 四、服務發現 五、LoadBalancer負載均衡 一、相關文章 基礎工程&#xff1a;gradle7.6.1springboot3.2.4創建微服務工程-CSDN博客 Eureka服務端啟動&#xff1a;Eureka服務端啟動-CSDN博客 LoadBalancer官方…

數據存儲方案h5py

對于百萬級別的大規模數據&#xff08;假設 N > 1,000,000&#xff09;&#xff0c;在保證讀取速度的前提下&#xff0c;需要綜合考慮 存儲效率、I/O 吞吐 和 內存管理。以下是針對超大規模數據的優化方案&#xff1a;&#x1f680; 終極方案&#xff1a;HDF5 (h5py) 分塊存…

ARINC818協議綜述

概要 航天領域ARINC818協議 協議的視頻幀 協議的層次 幀格式 容器 FC協議的5個層次 8b10b編碼 SOF EOF IDLEARINC818視頻傳輸協議 ARINC818協議的容器系統 幀頭控制協議FHCP 光纖通道協議 FC-AV ARINC818行場同步解析&#xff0c;上圖時序圖是關于行場同步小信號相關。ARINC818…

專題 二分法:查找與判定

概念解釋 概述 二分法在算法競賽中一般有這么一個用途&#xff1a;在一個具有單調性的解空間中找到符合題意的一個可行解。下面解釋幾個專有名詞&#xff1a; 解空間 很簡單&#xff0c;就是可能存在解的邏輯區域。這個在算法入門時應提到。 可行解 符合題意的解 單調性 …

硬核電子工程:從硅片到系統的全棧實戰指南—— 融合電路理論、嵌入式開發與PCB設計的工程藝術

一、電路基礎&#xff1a;硬件設計的底層邏輯1.1 基爾霍夫定律的硬件實現// STM32驗證KVL定律&#xff08;ADC采樣法&#xff09; void verify_kvl() {ADC_Enable(ADC1); // 啟用ADCfloat Vr1 read_ADC(PA0) * 3.3 / 4096; // 讀取R1電壓float Vr2 read_ADC(PA1) * 3.3 / 4…

Linux網絡:序列化與反序列化

引入&#xff1a;面向字節流 TCP是面向字節流的&#xff0c;如果按照字節流來讀取信息&#xff0c;可能會出問題 比如客戶傳入“1100”&#xff0c;服務器讀入“11”&#xff0c;后面的00被當作下一條信息&#xff0c;這就出問題了 我們可以將多個信息合并為一個字符串 在發送信…

二、Spark 開發環境搭建 IDEA + Maven 及 WordCount 案例實戰

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月20日 專欄&#xff1a;Spark教程 本教程將從零開始&#xff0c;一步步指導您如何在 IntelliJ IDEA 中搭建一個基于 Maven 和 Scala 的 Spark 開發環境&#xff0c;并最終完成經典的 WordCount 案例。 一、創建 Maven 項目…

【python】算法實現1

實現一個動態規劃算法 def dynamic_programming_example(n: int) -> List[int]:"""動態規劃示例&#xff1a;計算斐波那契數列參數:- n: 斐波那契數列的項數返回:- List[int]: 斐波那契數列前n項"""if n < 0:return []elif n 1:return […

C++控制臺貪吃蛇開發:從0到1繪制游戲世界

資料合集下載鏈接: ??https://pan.quark.cn/s/472bbdfcd014? 本文將帶你一步步實現以下目標: 初始化游戲元素(邊界、蛇、食物)的數據。 繪制靜態的游戲邊界(墻)。 在指定位置顯示蛇和食物。 學習并使用Windows API來精確定位光標,實現“指哪打哪”的繪圖。 隱藏閃爍…