广告

买白酒,找南将

Skip to content

vben 框架中引入 Modal 组件

原创
作者:章家龙
更新: 9/22/2024
字数: 0 字
时长: 0 分钟

前言

最近的项目中也是使用到了 vben-admin 这个框架 使用的技术栈是 v3+ts 里面的组件封装程度很高,一般来说上手比较难,所以想在开发的过程中记录自己在使用框架时的疑惑和过程。

新增 编辑 详情 弹框的引入

这里很多小伙伴就说了,引入个弹框不是很简单吗? 额 也确实很简单哈 ! 这个框架里呢有点不一样咱们下面就来说说哪里不一样。

image

这是我项目中某一个页面的文件规范,可以看到这个页面引入了两个弹框组件

image

这是组件中 HTML 部分可以看到已经是封装过了的它里面封装了一些内置方法我们拿过来直接用这个页面也是把它直接引进来

这里是引入组件和封装的方法。

!!注意 **v-bind="$attrs"**记得写,用于将弹窗组件的 **attribute** 传入 **BasicModal** 组件。

javascript
import { BasicModal, useModalInner } from '@/components/Modal'
import { BasicForm, useForm } from '@/components/Form'
javascript
//这里定义个亿变量用于控制title的展示
const isUpdate = ref < boolean > false
const title =
  computed <
  string >
  (() => {
    return isUpdate.value ? '编辑信息' : '添加信息'
  })

//这个地方必须要写 不写的话 弹框的显隐就会失效
const [registerInnerModal, { modalLoading, closeModal }] = useModalInner(
  //这里是拿回调的值
  async (data: { record?: Recordable, update: boolean }) => {
    modalLoading(true)
    const { record, update } = data
    isUpdate.value = update
    if (update && record) {
      const ret = await demoInfo(record.id)
      await setFieldsValue(ret)
    }
    modalLoading(false)
  },
)

useModalInner 用于操作独立组件

Plain
const [register, { closeModal, setModalProps }] = useModalInner(callback);
callback
type: (data:any)=>void


回调函数用于接收 openModal 第二个参数传递的值
useModal((data: any) => {
  console.log(data);
});


//关闭弹框
closeModal();

//用于修改确认按钮的 loading 状态
changeOkLoading(true);

//用于修改 modal 的 loading 状态
changeLoading(true);

一般根据情况去修改弹框里的内容更改弹框的状态等等

下面再说一下再页面中引入

javascript
//在v3中直接引入使用 不用注册
  <!-- 弹窗 -->
    <DemoModal @register="registerModal" @reload="reload" />
    <ChooseCompany @register="registerChooseCompany" />


  /* 引入 自定义弹窗 组件 */
  import DemoModal from './components/DemoModal.vue';
  import ChooseCompany from './components/ChooseCompany.vue';

引入进来之后我们就要使用这个弹框 框架里也是直接把控制弹框的显隐 传参 加载都封装好了 我们只用调用方法

!!在这里我就遇到了一个问题 引入两个弹框组件的时候分别调用成了一个问题 研究了一下也是找到了如何解决

javascript
/* 使用 useModal hooks */
//useModal 用于操作组件
//registerModal   registerChooseCompany 这个是定义组件的名字 以便于区分 然后分别定义 以便于在调用的时候区分
const [registerModal, { openModal }] = useModal()
const [registerChooseCompany, { openModal: openChooseCompany }] = useModal()

// 修改任务
function handleEdit(record: Recordable) {
  openModal(true, { record, update: true })
}
//  添加任务
function handleAdd() {
  openModal(true, { update: false })
}

// 选择企业
function handleChooseCompany() {
  openChooseCompany(true, { update: false })
}

//用于打开/关闭弹窗
// true/false: 打开关闭弹窗
// data: 传递到子组件的数据
//openModal(true, data);

用于关闭弹窗
closeModal()

//用于更改 modal 的 props 参数因为 modal 内容独立成组件,如果在外部页面需要更改 props 可能比较麻烦,所以提供 setModalProps 方便更改内部 modal 的 props
//Props 内容可以见下方
setModalProps(props)

register 用于注册 **useModal**,如果需要使用 **useModal** 提供的 api,必须将 **register** 传入组件的 **onRegister**。

原理其实很简单,就是 vue 的组件子传父通信,内部通过 **emit("register",instance)** 实现。

同时独立出去的组件需要将 **attrs** 绑定到 **BasicModal** 上面。

prpos 内容

属性类型默认值可选值说明
titlestring--modal 标题
heightnumber--固定 modal 的高度
minHeightnumber--设置 modal 的最小高度
draggablebooleantruetrue/false是否开启拖拽
useWrapperbooleantruetrue/false是否开启自适应高度,开启后会跟随屏幕变化自适应内容,并出现滚动条
wrapperFooterOffsetnumber0-开启是适应高度后,如果超过屏幕高度,底部和顶部会保持一样的间距,该参数可以用来缩小底部的间距
canFullscreenbooleantruetrue/false是否可以进行全屏
defaultFullscreenbooleanfalsetrue/false默认全屏
loadingbooleanfalsetrue/falseloading 状态
loadingTipstring--loading 文本
showCancelBtnbooleantruetrue/false显示关闭按钮
showOkBtnbooleantruetrue/false显示确认按钮
helpMessagestring , string[]--标题右侧提示文本
centeredbooleanfalsetrue/false是否居中弹窗
cancelTextstring'关闭'-关闭按钮文本
okTextstring'保存'-确认按钮文本
closeFunc() => Promise<boolean>关闭函数-关闭前执行,返回 true 则关闭,否则不关闭

Events

事件回调参数说明
okfunction(e)点击确定回调
cancelfunction(e)点击取消回调
visible-change(visible:boolean)=>{}打开或者关闭触发

Slots

名称说明
default默认区域
footer底部区域(会替换掉默认的按钮)
insertFooter关闭按钮的左边(不使用 footer 插槽时有效)
centerFooter关闭按钮和确认按钮的中间(不使用 footer 插槽时有效)
appendFooter确认按钮的右边(不使用 footer 插槽时有效)

本站搭建特别鸣谢【茂神大佬】