关于 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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; 经控制器快速计算并提取各次谐波电流的…