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
}
开发弹窗功能
- 定义弹框表单
export interface CreateParams {userName: stringuserEmail: stringmobile?: numberjob?: stringstate?: numberroleList?: string[]deptId?: string[]userImg: string
}
- 添加表单验证
// 用户名称、userEmail和部门是必填
<Form.Itemname="userEmail"label="邮箱"rules={[{required: true,message: '请输入邮箱'}]}
><Input placeholder="请输入邮箱:xxx@mars.com" />
</Form.Item>// 提交时验证
const valid = await form.validateFields()
- 定义弹框
<Modaltitle={action === 'create' ? '新增用户' : '编辑用户'}width={800}open={visible}okText="确定"cancelText="取消"onOk={handleOk}onCancel={handleCancel}
>......
</Modal>
相关接口
-
部门列表
-
角色列表
等后面讲解完部门和角色以后,再过来把用户列表完善。
具体也需要结合AntD文档参考
相关文章:
React18-完成弹窗封装
弹框封装 用法 // 创建 userRef.current?.open(create) // 修改 userRef.current?.open(edit,values){/* 创建用户 */} <CreateUser mRef{userRef} update{} />组件暴露open方法 文档地址:https://react.dev/reference/react/useImperativeHandle useIm…...
蓝桥杯2024/1/31-----底层测试模板
和之前一样建好工程文件夹,里边包含User(放工程文件,mian.c)、Driver(存放底层文件如Led.c,Led.h等) 新建的工程先搭建框架,可以先书写底层函数(此次书写了四个函数并包含…...
蓝桥杯备战(AcWing算法基础课)-高精度-乘-低精度
目录 前言 1 题目描述 2 分析 2.1 关键代码 2.2 关键代码分析 3 代码 前言 详细的代码里面有自己的理解注释 1 题目描述 给定两个非负整数(不含前导 00) A 和 B,请你计算 AB 的值。 输入格式 共两行,第一行包含整数 A&a…...
C++设计模式-里氏替换原则
里氏替换原则定义了继承规范。(封装、继承、多态) 定义1:类型S对象o1,类型T对象o2,o1换成o2时程序意图不变,那么S是T的子类。 定义2:使用子类不破坏父类的意图。 注意:如果子类不…...
compose LazyColumn + items没有自动刷新问题
val dataLists by remember { mutableStateOf(datas) } 数据更改后列表不刷新问题。 val dataLists by remember { mutableStateOf(datas) } LazyColumn(modifier Modifier.padding(top 5.dp)) {items(dataLists) {....}} 可以将mutableStateOf 改为mutableStateListOf解决…...
Java八大常用排序算法
1冒泡排序 对于冒泡排序相信我们都比较熟悉了,其核心思想就是相邻元素两两比较,把较大的元素放到后面,在一轮比较完成之后,最大的元素就位于最后一个位置了,就好像是气泡,慢慢的浮出了水面一样 Jave 实现 …...
编程笔记 html5cssjs 075 Javascript 常量和变量
编程笔记 html5&css&js 075 Javascript 常量和变量 一、JavaScript 变量二、JavaScript 常量三、示例:小结: 在JavaScript中,变量和常量是用来存储数据的占位符。它们的主要区别在于可变性:变量的值可以改变,而…...
题目 1159: 偶数求和
题目描述: 有一个长度为n(n<100)的数列,该数列定义为从2开始的递增有序偶数(公差为2的等差数列),现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序…...
呼吸灯--FPGA
目录 1.breath_led.v 2.tb_breath_led.v 呼吸灯就是从完全熄灭到完全点亮,再从完全点亮到完全熄灭。具体就是通过控制PWM的占空比控制亮灭程度。 绘制PWM波的步骤就是,首先灯是在第一个时钟周期保持高电平熄灭状态,在第二个时钟周期保持1/1…...
MySQL数据库①_MySQL入门(概念+使用)
目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库,服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…...
虚幻UE 特效-Niagara特效实战-魔法阵
回顾Niagara特效基础知识:虚幻UE 特效-Niagara特效初识 其他四篇实战:UE 特效-Niagara特效实战-烟雾、喷泉、 虚幻UE 特效-Niagara特效实战-火焰、烛火、 虚幻UE 特效-Niagara特效实战-雨天、 虚幻UE 特效-Niagara特效实战-眩晕。 本篇笔记记录了使用空模…...
Qt多语言翻译
Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…...
Latex学习记录
目录 1.Latex各种箭头符号总结 2.[Latex]公式编辑,编号、对齐 3.Latex公式编号: 多行公式多编号,多行公式单编号 4.LaTex中输入空格以及换行 1.Latex各种箭头符号总结 箭头符号 - ➚ (piliapp.com)https://cn.piliapp.com/symbol/arrow/Latex各种箭头…...
你在做绩效考核,还是绩效管理?二者有什么区别
绩效考核,为什么99%都失败,最后一地鸡毛?败在指标! 绩效管理,为什么大多数企业都能成功,而且越做越好?成在目标! 丢掉层层指标,人人制定目标,这是企业重新定…...
ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发
需求分析 展示切换动画搜索框输入文字,自动发送请求搜索结果展示搜索状态维护历史搜索展示,点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…...
C系列-柔性数组
🌈个人主页: 会编程的果子君 💫个人格言:“成为自己未来的主人~” 目录 编辑 柔性数组 柔性数组的特点 柔性数组的使用 柔性数组的优势 柔性数组 也许你从来没有听说过柔性数组这个概念,但是它确实是存在的,C99中&#…...
【Linux网络编程一】网络基础1(网络框架)
【Linux网络编程一】网络基础1(网络框架) 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点:网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…...
springboot156基于SpringBoot+Vue的常规应急物资管理系统
基于SpringBootVue的常规应急物资管理系统的设计与实现 摘 要 1 ABSTRACT 2 第一章 绪论 3 1.1研究背景 3 1.2研究意义 3 1.3国内外研究现状 4 1.3.1国外研究现状 4 1.3.2国内研究现状 4 1.4研究内容与方法 5 1.4.1研究内容 5 1.4.2研究方法 5 1.5论文的组织结构 5…...
学习MySQL的MyISAM存储引擎
学习MySQL的MyISAM存储引擎 MySQL的MyISAM存储引擎是MySQL早期版本中默认的存储引擎,后来被InnoDB所取代。尽管InnoDB在许多方面提供了更高级的特性,如事务处理、行级锁定和外键支持,MyISAM仍然因其简单性、高性能以及对全文搜索的支持而被广…...
nginx 的 ngx_http_upstream_dynamic_module 动态域名解析功能的使用和源码详解
tengine ngx_http_upstream_dynamic_module 动态域名解析功能的代码详细解析 1. 为什么需要域名动态解析2. 配置指令3. 加载模块3. 源码分析3.1 指令解析3.2 upstream负载均衡算法的初始化3.3 upstream负载均衡上下文的初始化3.4 获取upstream的服务器地址3.5 域名解析回调处理…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
