自定义React Hooks useModal

作者:陈佳鑫
时间:2023-2-7

使用 React Hooks 自定义 use 开发,适用于 modal 弹出框状态管理,减少使用 modal 多参数定义

类型声明

interface IModalProps<T = any> {
  visible: boolean
  type?: 'add' | 'update'
  data: T | undefined
}
参数类型说明
visibleboolean是否展示 modal 框
typeadd updateadd:新增, update:修改
dataT存储数据

useModalProps 类型

function useModalProps<T = any>(
  props?: IModalProps<T>
): [
  IModalProps<T>,
  {
    showModal: (data: T, type?: 'add' | 'update') => void
    hideModal: () => void
    setModalData: (data: T) => void
    cleanModalData: () => void
    closeEmptyModalData: () => void
  }
]
参数类型说明
showModalFunction(data, type): void打开 modal 框 data: 需要存储的数据,type: 打开类型
hideModalFunction(): void隐藏 modal 框
setModalDataFunction(data): void更新 data 数据
cleanModalDataFunction(): void清除 data 数据
closeEmptyModalDataFunction(): voidmodal 框关闭后清除 data 数据

整体代码

export function useModalProps<T = any>(
  props?: IModalProps<T>
): [
  IModalProps<T>,
  {
    showModal: (data: T, type?: 'add' | 'update') => void
    hideModal: () => void
    setModalData: (data: T) => void
    cleanModalData: () => void
    closeEmptyModalData: () => void
  }
] {
  const [_modalData, _setModalData] = useState(
    props ?? { visible: false, data: undefined }
  )

  const showModal = (data: T, type?: 'add' | 'update') => {
    _setModalData({
      visible: true,
      type: type,
      data
    })
  }

  const hideModal = () => {
    _setModalData({
      visible: false,
      data: _modalData.data!
    })
  }

  const setModalData = (data: T) => {
    _setModalData({
      visible: _modalData.visible,
      type: _modalData.type,
      data
    })
  }

  const cleanModalData = () => {
    _setModalData({
      visible: _modalData.visible,
      data: undefined
    })
  }

  const closeEmptyModalData = () => {
    _setModalData({
      visible: false,
      data: undefined
    })
  }

  return [
    _modalData,
    { showModal, hideModal, cleanModalData, setModalData, closeEmptyModalData }
  ]
}

使用 useModal

const [useModal, useModalController] = useModalProps()
Last Updated:
Contributors: 1102166242@qq.com, cjx