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文档参考

相关推荐
像我这样帅的人丶你还20 分钟前
从交稿到甩锅预防:AI 前端流水线
前端·ai编程
想想弹幕会怎么做21 分钟前
如何构建一颗可交互的ui树?
前端
程序员陆业聪26 分钟前
我见过的最反直觉的 Android 架构问题:UseCase 越多,项目越烂
前端
Arya_aa33 分钟前
网络:前端向后端发送网络请求渲染在页面上,将EasyMock中的信息用前端vue框架编写代码,最终展示在浏览器
前端·vue.js
LlNingyu34 分钟前
文艺复兴,什么是CSRF,常见形式(一)
前端·安全·web安全·csrf
晓131337 分钟前
React篇——第三章 状态管理之 Redux 篇
前端·javascript·react.js
子兮曰42 分钟前
🚀24k Star 的 Pretext 为何突然爆火:它不是排版库,而是在重写 Web 文本测量
前端·javascript·github
@大迁世界1 小时前
11.在 React.js 中,state 与 props 的差异体现在哪里?
前端·javascript·react.js·前端框架·ecmascript
Giant1001 小时前
🔥前端跨域封神解法:Vite Proxy + Express CORS,一篇搞定所有跨域坑!
前端·javascript·面试
用户3167361303421 小时前
SSE消息推送前后端代码
前端·后端