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

React18-完成弹窗封装

弹框封装

用法

// 创建
userRef.current?.open('create')
// 修改
userRef.current?.open('edit',values){/* 创建用户 */}
<CreateUser mRef={userRef} update={} />

组件暴露open方法

文档地址:https://react.dev/reference/react/useImperativeHandle

useImperativeHandle(ref, createHandle, dependencies?)
方法一:ref + forwardRef + useImperativeHandle
// 父组件 OrderList
import React, { useEffect, useRef, useState } from 'react'export default () => {const userRef = useRef()const handleOpen = () => {userRef.current?.open()}return <CreateUser ref={userRef} />
}// 子组件 CreateUser
const CreateUser = forwardRef((props: IProp, ref: any) => {// 组件内部完成显隐const [visible, setVisible] = useState(false)// 暴露 open 方法给父组件调用useImperativeHandle(ref, () => ({open: () => {setVisible(true)}}))return (<Modaltitle="新增用户"width={800}open={visible}okText="确定"cancelText="取消"onOk={handleOk}onCancel={handleCancel}>...此处省略...</Modal>
})

forwardRef官方解释:https://zh-hans.reactjs.org/docs/react-api.html#reactforwardref

方法二:自定义属性 + useImperativeHandle
// 父组件 OrderList
import React, { useEffect, useRef, useState } from 'react'export default () => {const userRef = useRef()const handleOpen = () => {userRef.current?.open()}return <CreateOrder userRef={userRef} />
}// 子组件 CreateOrder
interface IProp {userRef: MutableRefObject<{ open: () => void } | undefined>
}
const CreateUser = (props: IProp) => {const [visible, setVisible] = useState(false)useImperativeHandle(props.userRef, () => ({open: () => {setVisible(true)}}))return (<Modaltitle="新增用户"width={800}open={visible}okText="确定"cancelText="取消"onOk={handleOk}onCancel={handleCancel}>...此处省略...</Modal>)
}

这种方式注意, 组件上面的属性不可以定义ref,需要自定义其它属性。

类型定义

import { MutableRefObject } from 'react'// 操作类型
export type IAction = 'create' | 'edit' | 'delete'// 弹框组件属性类型
export interface IModalProp {mRef: MutableRefObject<{ open: (type: IAction) => void } | undefined>update: () => void
}

开发弹窗功能

  1. 定义弹框表单
export interface CreateParams {userName: stringuserEmail: stringmobile?: numberjob?: stringstate?: numberroleList?: string[]deptId?: string[]userImg: string
}
  1. 添加表单验证
// 用户名称、userEmail和部门是必填
<Form.Itemname="userEmail"label="邮箱"rules={[{required: true,message: '请输入邮箱'}]}
><Input placeholder="请输入邮箱:xxx@mars.com" />
</Form.Item>// 提交时验证
const valid = await form.validateFields()
  1. 定义弹框
<Modaltitle={action === 'create' ? '新增用户' : '编辑用户'}width={800}open={visible}okText="确定"cancelText="取消"onOk={handleOk}onCancel={handleCancel}
>......
</Modal>

相关接口

  1. 部门列表

  2. 角色列表

等后面讲解完部门和角色以后,再过来把用户列表完善。
具体也需要结合AntD文档参考

http://www.lryc.cn/news/293700.html

相关文章:

  • 蓝桥杯2024/1/31-----底层测试模板
  • 蓝桥杯备战(AcWing算法基础课)-高精度-乘-低精度
  • C++设计模式-里氏替换原则
  • compose LazyColumn + items没有自动刷新问题
  • Java八大常用排序算法
  • 编程笔记 html5cssjs 075 Javascript 常量和变量
  • 题目 1159: 偶数求和
  • 呼吸灯--FPGA
  • MySQL数据库①_MySQL入门(概念+使用)
  • 虚幻UE 特效-Niagara特效实战-魔法阵
  • Qt多语言翻译
  • Latex学习记录
  • 你在做绩效考核,还是绩效管理?二者有什么区别
  • ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发
  • C系列-柔性数组
  • 【Linux网络编程一】网络基础1(网络框架)
  • springboot156基于SpringBoot+Vue的常规应急物资管理系统
  • 学习MySQL的MyISAM存储引擎
  • nginx 的 ngx_http_upstream_dynamic_module 动态域名解析功能的使用和源码详解
  • 前端vue/react项目压缩图片工具@yireen/squoosh-browser
  • 悬而未决:daterangepicker设置默认选择日期时间后点确认无值的BUG
  • composer常用命令
  • 2024年1月27日~2月2日周报
  • 红黑树,以及其在C++的set、map等数据结构中应用
  • C++(11)——内存管理
  • 《C++ Primer Plus》《3、数据处理》
  • Java 正则匹配sql
  • 服务器入门
  • 云端录制直播流视频,上传云盘
  • 【靶场实战】Pikachu靶场XSS跨站脚本关卡详解