当前位置: 首页 > news >正文

react 封装弹框组件 传递数据

当我们使用react 开发 封装组件 肯定涉及 子向父传值

我们来直接上代码

来一个子组件 

方式一:通过回调函数(最常用)

import React from 'react'
import { Modal } from 'antd'const CreateModal = (props) => {const {modalVisible,onSubmit,onCancel,title = "添加图书",children,okText = "确定",cancelText = "取消",width = 520,...restProps} = props// 子组件内部的处理函数const handleSubmit = () => {// 子组件准备要传递的数据const childData = {message: "这是子组件的数据",timestamp: new Date().getTime(),customField: "自定义字段"}// 调用父组件传递的回调函数,并传递数据onSubmit(childData)}const handleCancel = () => {const cancelData = {reason: "用户取消",time: new Date().toLocaleString()}onCancel(cancelData)}return (<Modaltitle={title}open={modalVisible}onOk={handleSubmit}onCancel={handleCancel}okText={okText}cancelText={cancelText}width={width}{...restProps}>{children || (<div><p>这里是默认内容</p><p>你可以通过 children 属性传入自定义内容</p></div>)}</Modal>)
}export default CreateModal

其实我认为这个 父向子 传值 传方法 其实相对来说 比 vue 好理解 相对来说

  onSubmit(childData)

当我们点击确定的时候 就可以 传值 给父组件。父组件绑定这个数据 就好了

<CreateModalmodalVisible={modalVisible}onSubmit={handleSubmit}onCancel={handleCancel}title="自定义标题">{/* 自定义内容 */}<div>这是自定义的弹窗内容</div></CreateModal>const [modalVisible, setModalVisible] = useState(false)const openModal = () => {setModalVisible(true)}const handleSubmit = (e) => {console.log(e, "e")}const handleCancel = () => {}

方式二:使用 forwardRef + useImperativeHandle

子组件

import React, { forwardRef, useImperativeHandle } from 'react'
import { Modal } from 'antd'const CreateModal = forwardRef((props, ref) => {const {modalVisible,onSubmit,onCancel,title = "添加图书",children,okText = "确定",cancelText = "取消",width = 520,...restProps} = props// 暴露给父组件的方法useImperativeHandle(ref, () => ({// 子组件的方法,父组件可以通过 ref 调用getChildData: () => {return {message: "来自子组件的数据",data: "其他数据"}},// 子组件的其他方法validateForm: () => {// 表单验证逻辑return true}}))const handleSubmit = () => {onSubmit()}const handleCancel = () => {onCancel()}return (<Modaltitle={title}open={modalVisible}onOk={handleSubmit}onCancel={handleCancel}okText={okText}cancelText={cancelText}width={width}{...restProps}>{children}</Modal>)
})export default CreateModal

父组件使用

import React, { useState, useRef } from 'react'
import { Button } from 'antd'
import CreateModal from './CreateModal'const ParentComponent = () => {const [modalVisible, setModalVisible] = useState(false)const modalRef = useRef()const handleSubmit = () => {// 通过 ref 获取子组件数据const childData = modalRef.current?.getChildData()console.log('子组件数据:', childData)// 验证表单const isValid = modalRef.current?.validateForm()if (isValid) {setModalVisible(false)}}const handleCancel = () => {setModalVisible(false)}return (<div><Button onClick={() => setModalVisible(true)}>打开弹窗</Button><CreateModalref={modalRef}modalVisible={modalVisible}onSubmit={handleSubmit}onCancel={handleCancel}/></div>)
}

方式三:使用 Context(适合深层嵌套)

子组件

import React, { createContext, useContext, useState } from 'react'
import { Modal } from 'antd'// 创建 Context
const ModalContext = createContext()const CreateModal = (props) => {const {modalVisible,onSubmit,onCancel,title = "添加图书",children,okText = "确定",cancelText = "取消",width = 520,...restProps} = propsconst [modalData, setModalData] = useState({})const handleSubmit = () => {// 传递数据给父组件onSubmit(modalData)}return (<ModalContext.Provider value={{ modalData, setModalData }}><Modaltitle={title}open={modalVisible}onOk={handleSubmit}onCancel={onCancel}okText={okText}cancelText={cancelText}width={width}{...restProps}>{children}</Modal></ModalContext.Provider>)
}// 在子组件内部使用
const ModalContent = () => {const { setModalData } = useContext(ModalContext)const handleInputChange = (e) => {setModalData(prev => ({...prev,inputValue: e.target.value}))}return (<div><input onChange={handleInputChange} placeholder="输入内容" /></div>)
}export { CreateModal, ModalContent }

总结

  • 方式一(回调函数):最常用,适合大多数场景

  • 方式二(forwardRef):适合需要调用子组件方法的场景

  • 方式三(Context):适合深层嵌套组件通信

推荐使用方式一,因为它最符合 React 的数据流理念,代码清晰易懂。

http://www.dtcms.com/a/610167.html

相关文章:

  • 宿州做网站安卓系统app
  • 用Maven的quickstart archetype创建项目并结合JUnit5单元测试
  • ELK Stack核心原理与运用要点解析
  • Spring前置准备(九)——Spring中的Bean类加载器
  • TDengine 字符串函数 LTRIM 用户手册
  • 【十一、Linux管理网络安全】
  • 免费的行情软件网站下载不用下载二字顺口名字公司
  • YOLOv5/8/9/10/11/12/13+oc-sort算法实现多目标跟踪
  • Android开发从零开始 - 第一章:Android概述与工程项目结构
  • Spring Boot 应用启动报错:FeignClientSpecification Bean 名称冲突解决方案
  • 个人网站建立平台俄罗斯军事基地
  • h5 建站网站 移动端大数据在营销中的应用
  • 基于RetinaNet的建筑设计师风格识别与分类研究_1
  • Mysql假如单表数据量上亿,会出现什么问题
  • 考研408--计算机网络--day4--组帧差错控制可靠传输
  • my.cnf详解
  • 做网站时最新菜品的背景图wordpress连接ftp
  • Java是编译型语言还是解释型语言 | 深入解析Java的执行机制与性能特点
  • 积分模式陷兑付危机:传统实体商业的“承诺陷阱”与破局之道
  • 网页版预编译SQL转换工具
  • 基于Springboot+vue的心理健康测评预约心理咨询师论坛系统
  • MySQL数据库入门指南
  • 品牌营销型网站建设策划工程在哪个网站做推广比较合适
  • 安卓 4.4.2 电视盒子 ADB 设置应用开机自启动
  • 绝对值伺服“编码器计数值溢出“保护报警
  • 小程序下载图片问题处理
  • 网站首页被k网站信息同步
  • 线性代数 - 叉积的分量形式与矩阵形式
  • 做网站业务的 怎么跑客户元氏网站制作
  • 2025-11-14 学习记录--Python-特征归一化方法(Min-Max或StandardScaler)