React18-完成弹窗封装

弹框封装

用法

js 复制代码
// 创建
userRef.current?.open('create')
// 修改
userRef.current?.open('edit',values)

{/* 创建用户 */}
<CreateUser mRef={userRef} update={} />

组件暴露open方法

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

js 复制代码
useImperativeHandle(ref, createHandle, dependencies?)
方法一:ref + forwardRef + useImperativeHandle
HTML 复制代码
// 父组件 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 (
    <Modal
      title="新增用户"
      width={800}
      open={visible}
      okText="确定"
      cancelText="取消"
      onOk={handleOk}
      onCancel={handleCancel}
    >...此处省略...</Modal>
})

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

方法二:自定义属性 + useImperativeHandle
HTML 复制代码
// 父组件 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 (
        <Modal
          title="新增用户"
          width={800}
          open={visible}
          okText="确定"
          cancelText="取消"
          onOk={handleOk}
          onCancel={handleCancel}
        >...此处省略...</Modal>
    )
}

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

类型定义

js 复制代码
import { MutableRefObject } from 'react'

// 操作类型
export type IAction = 'create' | 'edit' | 'delete'

// 弹框组件属性类型
export interface IModalProp {
  mRef: MutableRefObject<{ open: (type: IAction) => void } | undefined>
  update: () => void
}

开发弹窗功能

  1. 定义弹框表单
js 复制代码
export interface CreateParams {
  userName: string
  userEmail: string
  mobile?: number
  job?: string
  state?: number
  roleList?: string[]
  deptId?: string[]
  userImg: string
}
  1. 添加表单验证
js 复制代码
// 用户名称、userEmail和部门是必填
<Form.Item
  name="userEmail"
  label="邮箱"
  rules={[
    {
      required: true,
      message: '请输入邮箱'
    }
  ]}
>
  <Input placeholder="请输入邮箱:xxx@mars.com" />
</Form.Item>

// 提交时验证
const valid = await form.validateFields()
  1. 定义弹框
js 复制代码
<Modal
  title={action === 'create' ? '新增用户' : '编辑用户'}
  width={800}
  open={visible}
  okText="确定"
  cancelText="取消"
  onOk={handleOk}
  onCancel={handleCancel}
>
    ......
</Modal>

相关接口

  1. 部门列表

  2. 角色列表

等后面讲解完部门和角色以后,再过来把用户列表完善。

具体也需要结合AntD文档参考

相关推荐
雾削木8 小时前
B语言经典教程现代化重构
java·前端·stm32·单片机·嵌入式硬件
Cobyte8 小时前
20.Vue Vapor 的应用初始化
前端·javascript·vue.js
乘风gg9 小时前
手把手带你实践历时一年总结的 AI Code Review 最佳工作流!
前端·ai编程·cursor
禅思院9 小时前
POST请求发两次?一次讲透CORS预检机制,面试不再翻车
前端·架构·前端框架
IT_陈寒9 小时前
SpringBoot自动配置这么智能,为啥我写的Bean注入不了?
前端·人工智能·后端
LT10157974449 小时前
2026年Web自动化测试工具选型指南:多浏览器兼容解决方案
前端·测试工具·自动化
HYCS9 小时前
用pixi.js实现fabric.js(七):框选、ActiveObject和控制点
前端·javascript·canvas
云浪9 小时前
手把手教你用 fetch 读取 SSE 流,给 AI 聊天加上打字机效果
前端·javascript·vue.js
Csvn9 小时前
Tailwind 动态拼接类名失效?JIT 引擎正在"静态分析"你
前端