React筆記_組件之間進行數據傳遞

目錄

      • 父子組件傳值- props
        • 父傳子
        • 子傳父
      • 嵌套組件傳值-Context API
        • 概念
        • React.createContext API
        • Provider組件
          • 正確示例
          • 錯誤示例
        • 消費 Context
          • React.Consumer組件
          • useContext Hook
          • 區別
        • 使用場景
          • 舉例說明-用戶信息
      • 狀態管理-Redux

父子組件傳值- props

在React中父子組件傳值是單向數據流 => 數據必須是由父級傳到子級或者子級傳遞給父級層層傳遞!

父傳子

父組件通過在子組件的JSX標簽上添加屬性的方式來傳遞數據,子組件通過 props 對象接收。

傳遞的數據類型是不受限制的 = > 可以是字符串、數字、數組、對象、函數、甚至JSX元素。

  • 父組件

      <son  子組件接收的屬姓名=父組件的屬性值></son>
    
    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'export default function Page1(){const [num, setNum] = useState(1)return (<div>{/* 函數子組件 */}<Funcom num={num}/>{/* 類子組件 */}<Clcom num ={num}/><button onClick={()=>{setNum(preNum=>preNum+1)}}>editNum</button></div>)
    }
    
  • 子組件:

    • 函數子組件組件:在調用函數時將props作為參數傳入;
      function FunSon(props){
      // props直接使用
      }
      
      export default function Fun(props){console.log('渲染了') // 無論有沒有接收參數只要父組件更新都會重新渲染子組件return (<div><h4>函數子組件=={props.num}</h4></div>)
      }
      
    • 類子組件:通過this獲取props
      class ClaSon extends React.Component{// this.props使用
      }
      
      import React from 'react'export default  class Clcom extends React.Component {render() {console.log('render')  // 無論有沒有接收參數只要父組件更新都會重新渲染子組件return (<><h4>類組件=={this.props.num}</h4></>)}
      }
      
子傳父

子組件不能直接修改父組件的狀態(數據單向流動),果需要,父組件必須傳遞一個函數給子組件作為 prop,子組件在需要時調用這個函數,將數據作為參數傳回給父組件。

  • 父組件
    <Son 子組件調用的方法名={父組件的方法}></Son>
    
  • 子組件
    // 當子組件想要修改父組件的數據時
    // val是要修改的值props.方法名(val) // 函數組件this. props.方法名(val) // 類組件
    
  • 舉例說明
    父組件
    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'export default function Page1(){const [num, setNum] = useState(1)function editNum(val){setNum(val)}return (<div>{/* 函數子組件 */}<Funcom num={num} editNum={editNum}/>{/* 類子組件 */}<Clcom num ={num}  editNum={editNum}/></div>)
    }
    函數子組件
    export default function Fun(props){return (<div><h4>函數子組件=={props.num}</h4><button onClick={()=>{props.editNum(props.num+2)}}>函數組件editNum</button></div>)
    }
    
    類子組件
    import React from 'react'export default  class Clcom extends React.Component {render() {console.log('render')return (<><h4>類組件=={this.props.num}</h4><button onClick={()=>{this.props.editNum(this.props.num+1)}}>類組件editNum</button></>)}
    }
    

嵌套組件傳值-Context API

概念

Context API 是 React 提供的一種組件間通信機制,允許數據在組件樹中直接傳遞,無需通過 props 逐層傳遞。

React.createContext API

React.createContext 是一個函數,用于創建一個Context對象 => 該對象是管理 “全局”或“跨組件”數據的容器和通信機制。

React.createContext(defaultValue)
  • 參數:defaultValue;

    當一個組件在樹中找不到匹配的 Provider 時,React.Consumer/useContext就會返回這個 defaultValue;

    這個默認值對于測試組件或在沒有提供 Provider 的情況下非常有用

  • 返回值:一個Context對象

    {$$typeof: Symbol(react.context), // React 內部用于識別類型的符號_currentValue: 'light',          // 內部保存的當前值Provider: { ... },               // Provider 組件Consumer: { ... },               // Consumer 組件 (已較少使用)displayName: undefined,          // 用于 React DevTools 顯示的名稱
    }
    
Provider組件

Provider組件是React.createContext函數返回對象的屬性,允許消費組件訂閱 Context 的變化。

<MyContext.Provider value={...}><!-- 子組件樹-->
</MyContext.Provider>

value就是要傳遞給所有下層組件的數據,只要 value發生變化,所有訂閱該 Context 的后代組件都會強制重新渲染,即使它們使用了 React.memo 或 shouldComponentUpdate。

正確示例
  const ThemContext = createContext({theme:'right', color: 'red'})const [theme, setTheme] = useState({theme:'right', color: 'red'})return (<div><ThemContext.Provider value={theme}>{/* 其中所有的子組件以及其子組件都可以獲取到value */}<Funcom /><Clcom /></ThemContext.Provider></div>)
錯誤示例
<div><ThemContext.Provider value={{theme:'right', color: 'red'}}>{/* 其中所有的子組件以及其子組件都可以獲取到value */}<Funcom /><Clcom /></ThemContext.Provider>    
</div>

每次渲染時,value={ theme:‘right’, color: ‘red’ }都會創建一個全新的對象,導致所有消費者不必要的重渲染。

消費 Context

kan su me

React.Consumer組件

React.Consumer是類組件中訂閱 Context 變更的方式,函數組件已經逐漸使用useContext這個hook來替代了。

子元素是一個函數,函數的參數就是 ThemeContext 的當前值,返回值就是需要渲染的vodm;

 <ThemeContext.Consumer>{value=>{vdom}}</ThemeContext.Consumer>

舉例說明

  • 將context提取為一個單獨的文件themeContext

    import  {createContext} from 'react'
    export default createContext({theme:'right', color: 'red'})
    
  • 在頂級組件引入

    import  {useState} from 'react'
    import Funcom from '../component/Funcom'
    import Clcom from '../component/Clcom'
    import ThemContext from '../utils/themeContext'
    export default function Page1(){const [theme, setTheme] = useState({theme:'right', color: 'red'})function editTheme(){setTheme(prevalue => ({...prevalue, theme: prevalue.theme=='right' ? 'dack' : 'right',}))}return (<div><ThemContext.Provider value={theme}>{/* 其中所有的子組件以及其子組件都可以獲取到value */}<Funcom /><Clcom /><button onClick={editTheme}>edittheme</button></ThemContext.Provider></div>)
    }
    
  • 子組件中若是不需要使用則完全不需要改變

  • 在想要使用的組件去消費,比如此處在孫組件使用

     import React from 'react'import  ThemeContext  from '../utils/themeContext'class SonFun2 extends React.Component{render(){console.log('孫組件')return(<ThemeContext.Consumer>{value=>(<><h4>今天的主題是:{value.theme}</h4><div>今天的顏色是:{value.color}</div></>)}</ThemeContext.Consumer>)}}
    

    當在頂級組件點擊按鈕修改value值時會重新渲染所有組件,包括子組件(因為通過setState去修改數據本身就會渲染所有子組件)

useContext Hook

useContext是函數組件中訂閱 Context 變更的方式

const value = useContext(ThemeContext)

value就是要傳遞給所有下層組件的數據,只要 value發生變化,所有訂閱該 Context 的后代組件都會強制重新渲染

舉例說明

function SonFun(){const value = useContext(ThemeContext)return (<div><h4>function</h4><h4>今天的主題是:{value.theme}</h4><div>今天的顏色是:{value.color}</div></div>)
}
區別
函數組件類組件
方式useContext APIContext.consumer組件
語法只需要在函數頂部調用hook ,簡單明了需要在組件jsx語法中嵌套一個函數,語法稍顯冗長
易讀性可以并行調用多個context,簡單易懂若是存在多個context,容易造成回調地獄
性能基本相同基本相同
使用場景

推薦在值不經常改變的地方使用context,如主題切換用戶信息認證管理一些全局的、許多組件都需要的數據

對于頻繁更新的數據, 如表單輸入、實時坐標等,Context 可能不是最優解,因為只要 Context 的 value 變化,所有消費該 Context 的組件都會重新渲染,即使它們只使用了 value 的一部分。

舉例說明-用戶信息

狀態管理-Redux

redux

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

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

相關文章

Elixir通過Onvif協議控制IP攝像機,擴展ExOnvif的攝像頭停止移動 Stop 功能

ExOnvif官方文檔 在使用 Elixir 進行 IPdome 控制時&#xff0c;可以使用 ExOnvif 庫。 ExOnvif官方文檔中未給停止移動調用命令&#xff0c;自己按照onvif協議 Onvif協議 擴展的此項功能&#xff1b; 停止移動 Stop 在Onvif協議中&#xff0c;用于停止云臺移動的操作為Stop…

spring boot autoconfigure 自動配置的類,和手工 @configuration + @bean 本質區別

它們在本質功能上都是為了向 Spring 容器注冊 Bean&#xff0c;但在觸發方式、加載時機、可控性和適用場景上有明顯區別。可以這樣理解&#xff1a;1?? 核心區別對比維度Configuration Bean&#xff08;手工配置&#xff09;Spring Boot EnableAutoConfiguration / 自動配置…

論文解讀 | Franka 機器人沉浸式遠程操作:高斯濺射 VR 賦能的遙操框架研發與應用

研究背景 在工業制造、危險環境作業等領域&#xff0c;機器人遠程操作技術是突破人類作業邊界的關鍵手段。傳統遠程操作依賴2D 相機反饋與操縱桿控制&#xff0c;存在空間感知差、操作精度低、沉浸感弱等問題&#xff0c;難以滿足復雜移動操作任務需求。 例如在核設施退役、災后…

【Unity Shader學習筆記】(四)Shader編程

一、OpenGL與DirectX 這是計算機圖形學中兩個最核心的應用程序接口(API),它們充當了應用程序與顯卡硬件之間的橋梁,讓開發者能夠調用GPU進行圖形渲染和通用計算。 特性維度 OpenGL DirectX 主導公司 Khronos Group (原SGI) Microsoft

程序員之電工基礎-初嘗線掃相機

一、背景 興趣愛好來了&#xff0c;決定研發一個產品。涉及到電工和機械等知識&#xff0c;所以記錄一下相關的基礎知識。本期主題是初嘗線掃相機&#xff0c;雖然又回到了編程&#xff0c;但是對于我來說&#xff0c;硬件集成的經驗不足&#xff0c;缺乏相機、鏡頭的專業知識。…

qt QWebSocket詳解

1、概述 QWebSocket是Qt網絡模塊中的一個類&#xff0c;用于實現WebSocket協議的通信。WebSocket是一種全雙工的通信協議&#xff0c;允許在客戶端和服務器之間建立實時的雙向通信。QWebSocket提供了對WebSocket協議的支持&#xff0c;使得開發者能夠在Qt應用中方便地實現實時…

Java基礎IO流全解析:常用知識點與面試高頻考點匯總

Java基礎IO流全解析&#xff1a;常用知識點與面試高頻考點匯總 前言 IO&#xff08;Input/Output&#xff09;流是Java中處理數據傳輸的核心機制&#xff0c;無論是文件操作、網絡通信還是數據持久化&#xff0c;都離不開IO流的身影。對于Java初學者而言&#xff0c;IO流的分類…

PDF.AI-與你的PDF文檔對話

本文轉載自&#xff1a;PDF.AI-與你的PDF文檔對話 - Hello123工具導航 ** 一、&#x1f916; PDF.AI&#xff1a;秒懂 PDF 的智能對話助手 PDF.AI 是一款超實用的AI 文檔分析工具&#xff0c;專門幫你快速搞定各種 PDF 文件。不管多長的合同、報告或論文&#xff0c;你只需上…

微軟出品!這個免費開源工具集獲得了GitHub 123k程序員點贊

大家晚上好&#xff0c;我是顧北&#xff0c;是一名AI應用探索者&#xff0c;當然也是GitHub開源項目收集愛好者。最近我在整理Windows效率工具時&#xff0c;發現了一個讓我一晚上沒睡著覺的開源項目——微軟官方出品的 PowerToys&#xff0c;可謂是徹夜難眠啊。經過我兩個月多…

【開題答辯全過程】以 小眾商戶小程序為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

Vue 3.5 重磅新特性:useTemplateRef 讓模板引用更優雅、更高效!

Vue 3.5 重磅新特性:useTemplateRef 讓模板引用更優雅、更高效! 目錄 前言 什么是 useTemplateRef 傳統 ref 的問題 useTemplateRef 的優勢 基礎用法 進階用法 最佳實踐 遷移指南 性能對比 注意事項 總結 前言 Vue 3.5 帶來了一個激動人心的新特性 useTemplateRef,它徹底革…

uni app 的app端 寫入運行日志到指定文件夾。

uni app 的app 端 寫入指定目錄文件夾。并自動生成當前日期的日志文件。刪除十日前的日志文件其中 writefile.js 代碼如下const {default: logger } require("./logger")var name var url var params var method var resfunction setlog(name, url, params, method)…

桌面應用開發語言與框架選擇指南

桌面應用開發的語言和框架選擇非常豐富&#xff0c;從原生性能到跨平臺解決方案應有盡有。下面我將它們分為幾大類進行詳細介紹&#xff0c;并附上各自的優缺點和適用場景。 一、 原生開發 (Native Development) 原生開發能提供最佳的性能和與操作系統最完美的集成體驗。 1. …

C++知識

文章目錄1.Cmap為什么線程不安全?2.map大量插入會有性能問題&#xff0c;為什么3.set的應用場景4.map set mutiset mutimap unordered_map unordered_set的底層實現、使用場景、優缺點1.Cmap為什么線程不安全? 其實STL中的容器都是線程不安全的&#xff0c;如果想要線程安全…

自學嵌入式第三十四天:網絡編程-TCP

一、UDP用戶數據報收發次數要對應&#xff1b;數據與數據之間有邊界&#xff0c;多次調用收發時都是不同的數據報&#xff1b;接收方的數據大小>發送方的數據大小&#xff0c;如果接受方數據小了則會丟棄未讀的部分&#xff0c;再次調用只會讀下一包數據&#xff1b;二、服務…

Apache IoTDB:國產時序數據庫的崛起與工業物聯網的未來

&#x1f4d1;前言 在工業物聯網的浪潮中&#xff0c;數據不再是副產品&#xff0c;而是驅動決策的核心資產。"隨著物聯網、工業互聯網和智能監控的迅猛發展&#xff0c;時序數據正以前所未有的速度爆發。據預測&#xff0c;到2025年全球物聯網設備將達750億臺&#xff0c…

一鍵核驗,安全無憂!手機號三要素詳情版API,為您的業務筑牢身份認證防線

一、什么是手機號三要素核驗API&#xff1f; 手機號三要素核驗API 是一種通過編程接口&#xff0c;實時驗證一條個人身份信息是否與該國運營商登記的實名信息一致的在線服務。 這里的“三要素”特指&#xff1a; 姓名 身份證號碼 手機號碼 核驗過程&#xff1a;用戶提交上述三個…

輕松上手 qData 數據中臺開源版:Docker Compose 助你10分鐘跑起來

說在前面 誰適合看這份指南&#xff1f; 初次接觸 qData&#xff0c;希望快速體驗功能的小伙伴不想折騰復雜環境配置和前端打包的人想用“一鍵啟動”省事體驗完整平臺的用戶 我們已經為你準備好“開箱即用”的完整部署包&#xff0c;包括&#xff1a; ? 前端靜態資源&…

Qt讀寫Excel--QXlsx基本使用

1、概述 Document 類是一個用于操作 XLSX 文件的類&#xff0c;繼承自 QObject。它提供了對 Excel 文件的讀寫操作&#xff0c;包括單元格的讀寫、圖片和圖表的插入、單元格合并、列和行的格式化、數據驗證和條件格式化等功能。此外&#xff0c;它還支持對工作簿和工作表的操作…

P13929 [藍橋杯 2022 省 Java B] 山 題解

縮減一下題目的意思&#xff0c;問區間 [2022,2022222022] 有多少個數是回文數并且先單調不減&#xff0c;后單調不增。 因為有這兩條條件&#xff0c;我們可以得知在判斷時只用判斷前半段的每個數是不是和對面相應的位置相等&#xff0c;以及是否單調不減。 為什么不用看后半段…