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

React modal暴露ref简洁使用

  • 父组件使用
import { useRef } from 'react'
import { FormModal } from './modal'const IndexRoute = () => {const formRef = useRef<any>()const openModal = (row?: any) => {const params = {title: row?.id ? `【${row.name}】编辑` : '创建',isView: false,row,api: row?.id ?  editXXX : createXXX,refreshList: () => proTableProps.actionRef.current?.reload()}formRef.current?.acceptParams(params)}return (<><Button onClick={openModal}>open modal</Button><FormModal ref={formRef} />others page content</>)
}export default IndexRoute
  • 子组件
import { Icons } from '@/components/antd-icons'
import { Button, Form, Input, message, Modal, Upload } from 'antd'
import { forwardRef, useEffect, useImperativeHandle, useState } from 'react'export const FormModal = forwardRef((props: any, ref) => {const [form] = Form.useForm()const [confirmloading, setConfirmloading] = useState<boolean>(false)const [visible, setVisible] = useState(false)const [modalProps, setModalProps] = useState<any>({isView: false,title: '',row: {},api: () => {}})const { isView, title, row, api, refreshList } = modalPropsconst onCancel = () => {setConfirmloading(false)form.resetFields()setVisible(false)}const acceptParams = (params: any) => {setModalProps(params)setVisible(true)params.row ? form.setFieldsValue({ ...params.row }) : form.resetFields()}const onOk = async () => {form.validateFields().then(async formValue => {setConfirmloading(true)const res = await api({ ...formValue, id: row?.id })if (res) {message.success(`操作成功`)onCancel()refreshList()}setConfirmloading(false)})}useImperativeHandle(ref,() => ({acceptParams}),[])useEffect(() => {row && Object.keys(row)?.length > 0? form.setFieldsValue({ ...row }): form.resetFields()}, [row])const normFile = (e: { fileList: any }) => {if (Array.isArray(e)) {return e}return e && e.fileList}return (<ModalforceRendertitle={title}open={visible}onOk={onOk}onCancel={onCancel}confirmLoading={confirmloading}destroyOnClose={true}><Formform={form}disabled={isView}initialValues={row}layout="horizontal"labelCol={{ span: 4 }}size="small"><Form.Itemlabel="名称"name="name"rules={[{ required: true, message: '请输入版本名称!' }]}><Input placeholder="name" /></Form.Item>{/* 文件上传form包裹demo */}<Form.Itemname="calibration_zip"label="附件"valuePropName="fileList"getValueFromEvent={normFile}><Upload maxCount={1} beforeUpload={() => false}><Button size="small" icon={<Icons.UploadOutlined />}>上传</Button></Upload></Form.Item></Form></Modal>)
})
http://www.lryc.cn/news/458040.html

相关文章:

  • 小米路由器ax1500+DDNS+公网IP+花生壳实现远程访问
  • 毕设分享 大数据用户画像分析系统(源码分享)
  • 使用 Redis 实现分布式锁:原理、实现与优化
  • Android常用C++特性之std::make_pair
  • Kafka-参数详解
  • Docker Overlay2 空间优化
  • 第 3 章:使用 Vue 脚手架
  • Spring 循环依赖详解:问题分析与三级缓存解决方案
  • 爬虫prc技术----小红书爬取解决xs
  • uni-app之旅-day06-加入购物车
  • 【Kubernetes】常见面试题汇总(五十六)
  • LabVIEW激光诱导击穿光谱识别与分析系统
  • Redis的基础篇
  • java和python哪个好
  • Electron + ts + vue3 + vite
  • 《大规模语言模型从理论到实践》第一轮学习--分布式训练
  • 多模态智能
  • 【机器学习(十三)】机器学习回归案例之股票价格预测分析—Sentosa_DSML社区版
  • 大模型微调
  • 240607 继承
  • 轻松应对意外丢失:高效电脑数据恢复指南!
  • vue项目中播放rtsp视频流
  • tomcat部署web配置环境变量
  • 数据仓库技术及应用(练习1)
  • 老板的“神助攻”:公司电脑监控软件
  • 前端vue部署网站
  • Unity3D 动画回调函数详解
  • el-table表格表尾合计行,指定合计某几列,自定义合计方法
  • 一款工具替你解决Mac电脑菜单栏图标杂乱问题
  • MySQL 基础入门教程