關于 React 19 的四種組件通信方法

注意:使用的是UI庫是 antd-mobile

1.父子級組件通信

  • 父組件
  • 單向數據流:數據從父組件流向子組件。
  • 支持多種數據類型:字符串、數字、對象、數組、函數等。
  • 只讀性:子組件不能直接修改 props 中的數據。
import { useState } from 'react'
import YdNavbar1 from './components/Ydnavbar1'
function App() {const [right, setRight] = useState('操作')const handleDataFromChild = (data) => {setRight(data)}return (<><YdNavbar1 rightMsg={right} onSendData={handleDataFromChild}></YdNavbar1></>)
}export default App
  • 子組件
  • 子組件通過props接收父組件傳遞的函數,然后調用該函數并傳遞參數給父組件
  • 反向通信:通過回調函數實現子組件向父組件傳遞數據。
  • 事件驅動:通常與 onClick、onChange 等事件結合使用。
import '../App.css'
import { Toast, Space, NavBar } from 'antd-mobile'// 父傳子:子組件通過props接收父組件傳參(rightMsg)
const YdNavbar1 = ({ rightMsg, onSendData }) => {// 子傳父:子組件通過props接收父組件傳遞的函數(onSendData),然后調用該函數并傳遞參數給父組件const handleClick = () => {Toast.show({content: '提示',afterClose: () => {onSendData('兒子的問候')},})}return (<><div className="App"><Space style={{ width: '100vw' }} direction="vertical"><NavBar right={rightMsg} onBack={handleClick}>導航欄</NavBar></Space></div></>)
}export default YdNavbar1

2.通過Ref調用子組件方法

  • 父組件
  • 使用 useRef(父組件調用子組件方法)
  • 直接調用子組件方法:適用于需要父組件控制子組件行為的場景。
import { useState } from 'react'
import YdNavbar2 from './components/Ydnavbar2'
// 使用 useRef(父組件調用子組件方法)
import { useRef } from 'react'
function App() {const childRef = useRef(null)const callChildMethod = () => {childRef.current.sayHello()}return (<><YdNavbar2 ref={childRef}></YdNavbar2></>)
}export default App
  • 子組件
  • 需顯式暴露方法:子組件必須通過 useImperativeHandle 暴露方法。
import '../App.css'
import { Space, NavBar } from 'antd-mobile'
import { useImperativeHandle, forwardRef } from 'react'
// props 是必須的:當使用 forwardRef 時,組件的函數參數必須包含 props 和 ref,即使沒有使用 props
// 通過 forwardRef 包裹組件
const YdNavbar2 = forwardRef((props, ref) => {// 使用 useImperativeHandle 暴露給父組件方法(sayHello)useImperativeHandle(ref, () => ({sayHello: () => {console.log('使用ref調用子組件方法')},}))return (<><div className="App"><Space style={{ width: '100vw' }} direction="vertical"><NavBar>導航欄</NavBar></Space></div></>)
})export default YdNavbar2

3.使用 Context API(跨層級共享數據)

  • 在src目錄創建文件夾 contexts 創建 MyContext.js?文件,再創建 MyContextProvider.jsx 文件,如圖

  • MyContext.js
import { createContext } from 'react'// 可以創建多個 Context 對象
const MyContext = createContext()export default MyContext
  • MyContextProvider.jsx
import { useState } from 'react'
import MyContext from './MyContext'function MyProvider({ children }) {const [leftMsg, setLeftMsg] = useState('左邊')return (<MyContext.Provider value={{ leftMsg, setLeftMsg }}>{children}</MyContext.Provider>)
}
export default MyProvider
  • 組件1
import { useState } from 'react'
import YdNavbar3 from './components/Ydnavbar3'
// 使用 Context API(跨層級共享數據)
import MyProvider from './contexts/MyContextProvider'
function App() {return (<><MyProvider><YdNavbar3></YdNavbar3></MyProvider></>)
}export default App
  • 組件2
import '../App.css'
import { Toast, Space, NavBar } from 'antd-mobile'
// 使用 Context API(跨層級共享數據)
import { useContext } from 'react'
// 引用上下文對象
import MyContext from '../contexts/MyContext'const YdNavbar1 = () => {const { leftMsg, setLeftMsg } = useContext(MyContext)return (<><div className="App"><Space style={{ width: '100vw' }} direction="vertical"><NavBar left={leftMsg} onBack={() => setLeftMsg('哈哈哈')}>導航欄</NavBar></Space></div></>)
}export default YdNavbar1

4.使用 Zustand 狀態管理

  • 首先安裝?Zustand
npm i zustand
  • 在 src 下創建 stores 文件夾,創建文件 useStore.js 文件
// stores/userStore.js
import { create } from 'zustand'const useUserStore = create((set) => ({user: null, // 初始狀態setUser: (user) => set({ user }), // 修改用戶的方法
}))export default useUserStore
  • 組件使用方法
import { useState } from 'react'
import { Button, Space } from 'antd-mobile'
// 使用 Zustand 狀態管理
import useUserStore from './stores/userStore'
function App() {const { user, setUser } = useUserStore() // 獲取狀態和方法return (<><div>{user}</div><Button onClick={() => (user ? setUser(null) : setUser('132456'))}>改變用戶</Button></>)
}export default App

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

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

相關文章

OC-單例模式

文章目錄單例模式定義特點使用原因缺點模式介紹懶漢模式同步鎖實現dispatch_once餓漢模式實現總結懶漢模式優點缺點餓漢模式優點缺點單例模式 定義 單例模式&#xff0c;簡單的說就是一個類始終只對應同一個對象&#xff0c;每次獲取這個類的對象獲得的都是同一個實例 如果一…

[論文閱讀] 算法 | 抗量子+緊湊!SM3-OTS:基于國產哈希算法的一次簽名新方案

抗量子緊湊&#xff01;SM3-OTS&#xff1a;基于國產哈希算法的一次簽名新方案 論文信息信息類別具體內容論文原標題SM3-OTS: 基于國密算法SM3的緊湊型后量子一次簽名方案主要作者楊亞濤、殷方銳、陳亮宇、潘登研究機構1. 北京電子科技學院 電子與通信工程系&#xff08;北京 1…

C語言-指針用法概述

目錄 1.指針基礎概念 2. 指針與數組 3. 指針作為函數參數 4. 動態內存分配 5. 指針的高級用法 6. 常見錯誤與注意事項 7. 指針數組 vs. 數組指針 8.總結與建議 本文主要作為指針用法的復習&#xff0c;會對指針的大致用法進行舉例和概述。 1.指針基礎概念 ?什…

Java調用Whisper和Vosk語音識別(ASR)模型,實現高效實時語音識別(附源碼)

簡介 語音識別&#xff08;Automatic Speech Recognition, ASR&#xff09;是將人類的語音信號自動轉換為對應文字的技術&#xff0c;它使計算機能夠“聽懂”人說的話&#xff0c;是人機語音交互的核心技術&#xff0c;廣泛應用于智能助手、語音輸入、客服系統等場景。 現在我…

第3周 機器學習課堂記錄

1.學習問題的分類有監督的學習分類回歸無監督學習聚類密度估計&#xff1a;確定輸入空間中的數據的分布可視化&#xff1a;把高位空間中的數據投影到二維或三維空間強化學習不給定最優輸出的示例&#xff0c;而是通過試錯發現最優輸出2.泛化versus過度擬合背景引入&#xff1a;…

消息隊列(MQ)高級特性深度剖析:詳解RabbitMQ與Kafka

一、引言&#xff1a;為什么需要關注高級特性&#xff1f; 在現代分布式系統架構中&#xff0c;消息隊列&#xff08;Message Queue&#xff09;已成為不可或缺的核心組件。初級使用消息隊列可能只需幾行代碼就能實現基本功能&#xff0c;但要真正發揮其在大規模生產環境中的威…

【GPT入門】第65課 vllm指定其他卡運行的方法,解決單卡CUDA不足的問題

【GPT入門】第65課 vllm指定其他卡運行的方法&#xff0c;解決單卡CUDA不足的問題&#xff11;.原理說明&#xff1a;&#xff12;.實踐&#xff11;.原理 要將 vllm 部署在第二張 GPU 卡上&#xff08;設備編號為 1&#xff09;&#xff0c;只需在命令前添加 CUDA_VISIBLE_DE…

Spring Boot Actuator自定義指標與監控實踐指南

Spring Boot Actuator自定義指標與監控實踐指南 本篇文章以生產環境實戰經驗為主線&#xff0c;結合某電商系統的業務場景&#xff0c;講解如何在Spring Boot Actuator中添加并暴露自定義指標&#xff0c;并使用Prometheus和Grafana進行完整的監控與告警配置。 一、業務場景描述…

Vue報錯<template v-for=“option in cardOptions“ :key=“option.value“>

在Vue項目中遇到報錯&#xff0c;原因是模板中使用了<template>標簽內的v-for指令&#xff0c;而當前Vue版本不支持此用法。解決方案是移除<template>標簽&#xff0c;直接在<el-option>上使用v-for。同時優化計算屬性cardOptions&#xff0c;使其能夠兼容歷…

人工智能學習:Transformer結構中的規范化層(層歸一化)

Transformer結構中的規范化層(層歸一化) 一、規范化層(層歸一化)介紹 概念 層歸一化(Layer Normalization) 是一種用于提高深度神經網絡訓練穩定性和加速收斂的技術,廣泛應用于現代深度學習模型中,尤其是在Transformer等序列建模網絡中。它通過對每一層的輸出進行歸一化…

盼之代售 最新版 decode__1174

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 部分python代碼 cp1 execj…

Transformer系列 | Pytorch復現Transformer

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、Transformer和Seq2Seq 在之前的博客中我們學習了Seq2Seq(深度學習系列 | Seq2Seq端到端翻譯模型)&#xff0c;知曉了Attention為RNN帶來的優點。那么有沒有…

【MySQL】常用SQL語句

介紹常用的DDL語句、DML語句基本語法分號結尾使用空格和縮進不區分大小寫--或#注釋單行內容 /*注釋多行內容*/DDL數據定義語句&#xff1a;定義數據庫、表、字段一、操作庫-- 創建庫create database db1;-- 創建庫是否存在&#xff0c;不存在則創建create database if not exi…

云手機就是虛擬機嗎?

云手機并非等同于虛擬機&#xff0c;盡管二者存在一定相似性&#xff0c;但有著諸多區別&#xff0c;以下從多個方面來分析&#xff1a;云手機是一種基于云計算技術&#xff0c;將云端服務器虛擬化為手機設備&#xff0c;用戶能通過網絡遠程操控的虛擬手機服務&#xff0c;它從…

準確--Nginx 1.28.0 安裝與配置流程

Nginx 1.28.0 安裝與配置流程 1. 下載與解壓 cd ~ wget http://nginx.org/download/nginx-1.28.0.tar.gz tar -zxvf nginx-1.28.0.tar.gz cd nginx-1.28.02. 配置編譯參數 ./configure \--prefix/home/ynnewweb/nginx \--with-http_ssl_module \--with-http_gzip_static_module…

無標記點動捕新范式:Xsens系統助力人形機器人實現毫米級動作復刻

Xsen搭載Manus數據手套在機器人操作與機器學習中的應用當前&#xff0c;人形機器人正加速向工業裝配、家庭陪護、倉儲物流等場景滲透&#xff0c;而 “如何讓機器人的動作既符合人類運動規律&#xff0c;又能實現高精度執行” 成為制約其落地的核心瓶頸。Xsens 高精度全身動捕系…

mysql57超管root忘記密碼怎么辦

目錄 背景 1.首先停止數據庫 2.使用免密模式啟動 3.修改密碼 3.1刷新權限配置 3.2修改密碼 4.殺掉mysql 5.重新正常啟動mysql 6.查看mysql狀態 7.驗證 7.1首先服務器本地驗證 7.2遠程驗證 背景 數據庫密碼忘記了,急的抓耳撓腮,怎么也想不起來,于是就開始重置吧 1.…

RESTful API:@RequestParam與@PathVariable實戰對比

RequestParam vs PathVariable 在刪除和查找操作中的使用差異 在項目實戰中&#xff0c;選擇使用 RequestParam 還是 PathVariable 來接收ID參數&#xff0c;通常基于以下幾個考慮因素&#xff1a; 1. RESTful API 設計原則 查找操作使用 PathVariable GetMapping("/depts…

劇本殺小程序系統開發:開啟沉浸式社交娛樂新紀元

在當今數字化浪潮席卷的時代&#xff0c;社交娛樂方式正經歷著前所未有的變革。劇本殺&#xff0c;這一融合了角色扮演、推理懸疑與社交互動的線下娛樂項目&#xff0c;近年來迅速風靡全國&#xff0c;成為年輕人熱衷的社交新寵。而隨著移動互聯網的蓬勃發展&#xff0c;劇本殺…

中線安防保護器,也叫終端電氣綜合治理保護設備為現代生活筑起安全防線

中線安防保護器&#xff08;Neutral Line Protection Device&#xff0c;簡稱NLPD&#xff09;是一種專門用于監測和保護電力系統中性線的安全裝置。中線安防保護器的基本原理為:通過電流檢測環節采集系統中性線上過電流信息&#xff0c; 經控制器快速計算并提取各次諧波電流的…