【React 入門系列】React 組件通訊與生命周期詳解

🧩 第一章:組件通訊概述

在 React 開發中,組件是封裝的、獨立的功能單元。為了實現組件間的數據共享與協作,需要通過組件通訊機制

組件通訊的意義:
讓多個封閉的組件能夠共享數據,實現協作功能。


📥 第二章:組件 Props 基礎與進階

1. Props 的基本使用

組件是封閉的,要接收外部數據應通過 props(屬性) 實現。

? 使用方式:
  • 傳遞數據:給組件標簽添加屬性
  • 接收數據
    • 函數組件:通過參數?props?接收
    • 類組件:通過?this.props?接收
? 示例:
<Hello name="jack" age={19} />
// 函數組件
function Hello(props) {return <div>接收到數據:{props.name}</div>;
}
// 類組件
class Hello extends React.Component {render() {return <div>接收到數據:{this.props.age}</div>;}
}

2. Props 的特點

  1. 可傳遞任意類型數據

    <Helloname="root"age={19}colors={['red', 'blue']}fn={() => console.log('函數')}tag={<h1>標簽</h1>}
    />
  2. 只讀對象
    props 是只讀的,不能直接修改。

  3. 構造函數中使用 props
    如果類組件有構造函數,必須將 props 傳入 super(),否則無法在構造函數中訪問 props。

    constructor(props) {super(props);
    }

3. 組件通信的三種方式

? 1. 父組件 → 子組件

步驟:

  1. 父組件通過?state?傳遞數據
  2. 子組件通過?props?接收數據
class Parent extends React.Component {state = { lastName: "王" };render() {return <Child name={this.state.lastName} />;}
}
function Child(props) {return <div>子組件接收到數據:{props.name}</div>;
}

? 2. 子組件 → 父組件

使用回調函數實現:

  1. 父組件定義回調函數,并傳給子組件
  2. 子組件調用回調,傳入數據
class Parent extends React.Component {getChildMsg = (msg) => {console.log("接收到子組件數據", msg);};render() {return <Child getMsg={this.getChildMsg} />;}
}
class Child extends React.Component {state = { childMsg: "react" };handleClick = () => {this.props.getMsg(this.state.childMsg);};return <button onClick={this.handleClick}>點擊傳值</button>;
}

? 3. 兄弟組件通信

核心思想:狀態提升(Lifting State Up)

  1. 將共享狀態提升到公共父組件
  2. 父組件提供狀態和更新方法
  3. 子組件通過 props 接收并使用
class App extends React.Component {state = { count: 0 };handleClick = () => {this.setState({ count: this.state.count + 1 });};render() {return (<div><Zi num={this.state.count} /><Zi2 numadd={this.handleClick} /></div>);}
}
function Zi(props) {return <div>count: {props.num}</div>;
}function Zi2(props) {return <button onClick={props.numadd}>Click Me</button>;
}

? 4. Context 組件(跨層級通信)

當組件嵌套較深或為“遠方親戚”時,使用 Context 實現通信更高效。

使用步驟:

  1. 創建?Provider?和?Consumer
const { Provider, Consumer } = React.createContext();
  1. 使用?Provider?提供數據
<Provider value="pink"><div className="APP"><Child /></div>
</Provider>
  1. 使用?Consumer?消費數據
<Consumer>{data => <span>數據為:{data}</span>}
</Consumer>

🧠 第三章:Props 深入理解

1.?children?屬性

表示組件標簽的子節點,可以是任意類型:文本、React 元素、組件、甚至是函數。

function Hello(props) {return <div>組件的子節點:{props.children}</div>;
}
<Hello>我是子節點</Hello>

2. Props 校驗(PropTypes)

使用 prop-types 包進行類型校驗,確保組件接收的數據符合預期。

安裝:

npm install prop-types

使用:

import PropTypes from 'prop-types';App.propTypes = {colors: PropTypes.array,fn: PropTypes.func.isRequired,shape: PropTypes.shape({id: PropTypes.number,name: PropTypes.string})
};

3. Props 默認值(defaultProps)

設置默認值,防止 props 未傳時出錯。

App.defaultProps = {pageSize: 10
};
function App(props) {return <div>默認值:{props.pageSize}</div>;
}

🕒 第四章:組件生命周期詳解

組件的生命周期分為三個階段:創建、更新、卸載,每個階段都有對應的鉤子函數。

1. 創建階段(Mounting)

執行時機:組件創建時(頁面加載時)

執行順序:

constructor → render() → componentDidMount
  • constructor:初始化 state,綁定 this
  • render:渲染 UI(不能調用?setState
  • componentDidMount:組件掛載后,適合發送網絡請求、DOM 操作
constructor(props) {super(props);this.state = { count: 0 };
}
componentDidMount() {console.log('組件已掛載');
}

2. 更新階段(Updating)

執行時機:組件更新時(如調用 setState()forceUpdate() 或接收到新的 props)

執行順序:

render() → componentDidUpdate()
  • render:重新渲染 UI
  • componentDidUpdate:組件更新后,適合發送網絡請求、DOM 操作
componentDidUpdate(prevProps, prevState) {if (prevState.count !== this.state.count) {console.log('組件已更新');}
}

3. 卸載階段(Unmounting)

執行時機:組件從頁面消失

執行函數:

componentWillUnmount() {// 清理工作,如清除定時器、取消訂閱等
}

📚 總結

模塊內容
組件通訊Props、回調函數、Context、狀態提升
Props傳遞任意類型數據、只讀、children、校驗、默認值
生命周期創建、更新、卸載階段,各階段鉤子函數用途

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

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

相關文章

前端開發 Vue 狀態優化

Vue 項目中的狀態優化一般都會用Pinia替代Vuex&#xff0c;Pinia 是 Vue 生態系統中的一個輕量級狀態管理庫&#xff0c;作為 Vuex 的替代品&#xff0c;它提供了更簡潔的 API 和更好的性能。模塊化管理&#xff1a;使用 Pinia 時&#xff0c;建議將狀態拆分為多個 store 模塊&…

虛幻基礎:創建角色——FPS

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄創建角色設置模型添加攝像機添加位置&#xff1a;插槽彈簧臂&#xff1a;伸縮防止由碰撞導致攝像機穿模攝像機添加武器添加位置&#xff1a;插槽創建動畫藍圖&#xff1a;主動獲取角色數據并播放相應動畫設置角色控制…

2025年入局蘋果Vision Pro開發:從零到發布的完整路線圖

蘋果Vision Pro的發布標志著空間計算(Spatial Computing)進入主流市場。作為開發者,如何快速掌握visionOS開發?本文將為你提供詳細的路線圖、實踐建議與資源指南,涵蓋從窗口式應用到沉浸式3D應用的完整開發路徑。 一、visionOS開發的核心目標與階段劃分 visionOS的開發可…

百度文心大模型ERNIE全面解析

百度文心大模型ERNIE概述 百度推出的文心大模型(ERNIE,Enhanced Representation through kNowledge IntEgration)系列是結合知識增強技術的預訓練大模型,涵蓋自然語言處理(NLP)、跨模態、行業應用等多個方向。其開源版本為開發者提供了可商用的大模型能力支持。 ERNIE的…

【SpringAI實戰】提示詞工程實現哄哄模擬器

一、前言 二、實現效果 三、代碼實現 3.1 后端實現 3.2 前端實現 一、前言 Spring AI詳解&#xff1a;【Spring AI詳解】開啟Java生態的智能應用開發新時代(附不同功能的Spring AI實戰項目)-CSDN博客 二、實現效果 游戲規則很簡單&#xff0c;就是說你的女友生氣了&#x…

速通python加密之AES加密

AES加密 AES加密&#xff08;Advanced Encryption Standard&#xff0c;高級加密標準&#xff09;是目前全球公認的最安全、應用最廣泛的對稱加密算法之一&#xff0c;于2001年被美國國家標準與技術研究院&#xff08;NIST&#xff09;確定為替代DES的標準加密算法&#xff0c;…

Java 對象秒變 Map:字段自由伸縮的優雅實現

前言 在開發中,我們常常需要把對象轉成 Map 格式,用于序列化、傳輸、展示,甚至硬塞給某些第三方框架吃進去再吐出來。乍一看很簡單,字段多起來后就像打翻調色盤,維護起來一不小心就翻車。想優雅地搞定這事,必須有一套穩妥、可擴展的方案,才能寫出讓同事膜拜、領導點贊、…

激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定

激光雷達-相機標定工具&#xff1a;支持普通相機和魚眼相機的交互式標定 前言 在自動駕駛、機器人導航等領域&#xff0c;激光雷達和相機的標定是一個基礎而重要的問題。準確的標定結果直接影響后續的感知算法性能。本文將介紹一個開源的激光雷達-相機標定工具&#xff0c;支持…

linux shell從入門到精通(二)——變量操作

1.什么是變量變量在許多程序設計語言中都有定義&#xff0c;與變量相伴地有使用范圍地定義。Linux Shell也不例外。變量&#xff0c;本質上就是一個鍵值對。例如&#xff1a;str“hello”就是將字符串值“hello”賦予鍵str。在str地使用范圍內&#xff0c;我們都可以用str來引用…

[Linux入門] 初學者入門:Linux DNS 域名解析服務詳解

目錄 一、域名服務基礎&#xff1a;從 “名字” 到 “地址” 的轉換 1??什么是域名&#xff1f; 2??什么是 DNS&#xff1f; 3??DNS 用 TCP 還是 UDP&#xff1f; 二、DNS 服務器&#xff1a;各司其職的 “導航站” 1??根域名服務器 2??頂級域名服務器 3??權…

iview表單驗證一直提示為空的幾個原因?

1.Form上的rules是否配置正確&#xff1b; 2.Form-item的prop是否配置正確&#xff1b; 3.規則的名稱和input的v-model是否對應&#xff1b; 4.驗證的字段是否響應&#xff0c;新增字段使用this. $set. © 著作權歸作者所有,轉載或內容合作請聯系作者 平臺聲明&#xff1…

SpringBoot3(若依框架)集成Mybatis-Plus和單元測試功能,以及問題解決

一、Mybatis-Plus集成 新增依賴到父級pom.xml&#xff0c;原先的mybatis依賴可以不動需要注意 mybatis-plus與mybatis版本之間的沖突&#xff0c;不要輕易改動依賴&#xff0c;不然分頁也容易出現問題分類頂級pom.xml下面&#xff0c;如果沒有引入還是出現報錯&#xff0c;在co…

刪除遠程分支上非本分支的提交記錄

要刪除遠程分支上非本分支的提交記錄&#xff08;即主分支的提交歷史&#xff09;&#xff0c;需要使用 Git 的重寫歷史功能。以下是完整解決方案&#xff1a; 解決方案步驟&#xff1a; 創建干凈的新分支&#xff08;基于主分支最新提交&#xff09; # 切換到主分支并更新 git…

Flask input 和datalist結合

<input list"categories" name"category" id"category" class"form-control" placeholder"任務分類" required> 這段代碼是一個 HTML 輸入控件&#xff0c;結合了 <input> 和 <datalist>&#xff0c;用來…

嵌入式分享#27:原來GT911有兩個I2C地址(全志T527)

最近在調試全志T527的觸摸功能時&#xff0c;發現GT911觸摸芯片的I2C地址有時是0x5d&#xff0c;有時又識別成0x14&#xff0c;不知道大家有沒有遇到過類似這個情況。雖然最后使用0x5d地址調通了觸摸功能&#xff0c;但是一直還是很困惑&#xff0c;為什么會出現0x14和0x5d兩個…

Linux運維新人自用筆記(Rsync遠程傳輸備份,服務端、郵箱和客戶端配置、腳本)

內容全為個人理解和自查資料梳理&#xff0c;歡迎各位大神指點&#xff01;每天學習較為零散。day24一、Rsync傳輸文件#安裝rsync#-a遞歸同步&#xff08;包含子目錄&#xff09;保留文件權限、所有者、組、時間戳等元數據 #??-z傳輸時壓縮數據 #??-v顯示詳細同步過程 #??…

以 “有機” 重構增長:云集從電商平臺到健康生活社區的躍遷

當電商行業陷入流量爭奪的紅海&#xff0c;同質化運營模式難以突破增長瓶頸時&#xff0c;云集以從精選電商到有機生活平臺的戰略轉型&#xff0c;開辟出差異化發展路徑。其轉型并非憑經驗決斷的孤例&#xff0c;而是建立在對市場趨勢的精準研判、用戶需求的深度解碼&#xff0…

【2025最新版】midjourney小白零基礎入門到精通教程!人工智能繪圖+AI繪圖+AI畫圖,一鍵出圖教程 (持續更新)

前言 現在市面上相關的AI繪畫工具非常多&#xff0c;有6pen.art、Stable Diffusion、DALL.E、Midjourney等。 而MJ就目前而言&#xff0c;它是一款強大的人工智能工具&#xff0c;旨在幫助設計師和創意人員完成各種設計任務。 非常適合我們圖像工作者&#xff0c;從 UI 設計到…

2025年滲透測試面試題總結-2025年HW(護網面試) 70(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 70 一、自我介紹 二、同源策略 & 三大漏洞對比解析 1. 同源策略&#xff08;SOP&…

加權卡爾曼濾波

加權卡爾曼濾波融合&#xff0c;它通過給不同傳感器或估計結果分配不同的權重&#xff0c;來提高狀態估計的精度和可靠性。一、卡爾曼濾波1.狀態方程2.觀測方程其中&#xff1a;基本方程①狀態一步預測②狀態估計③濾波增益④一步預測均方差⑤估計均方誤差二、加權卡爾曼濾波對…