在vue3中使用tsx结合render封装一个项目内通用的弹窗组件

场景: 在大屏项目中经常需要用到弹窗的需求,通常一个项目内弹窗的样式是一致的,如果不封装一个弹窗组件hook的话,每一个弹窗都需要单独封装为一个组件然后再放到项目layout的最外层,再通过store全局判断哪个弹窗显示,这样显然很麻烦,所以现在我封装一个通过tsx及render渲染弹窗组件的hooks,需要使用弹窗就调用hooks传入弹窗组件就行

思路: 首先封装一个弹窗基础框架组件(包括弹窗外观样式及关闭和底部操作等事件)提供插槽展示每个弹窗的内容部分,然后在需要用到一个弹窗时封装这个弹窗的内容组件,然后调用hooks传入这个内容组件就可以打开弹窗(在封装的hooks中会通过render将弹窗基础组件和内容组件合并渲染出来生成一个元素节点,再通过document.body.appendChild将生成的元素节点挂载到页面中以实现弹窗的展示效果)

代码步骤:

(1)封装弹窗组件框架

<template>
  <el-dialog class="models-default" v-bind="props" :model-value="visible">
    <slot></slot>
    <!-- 弹窗头部插槽 -->
    <template v-if="$slots.header" #header>
      <slot name="header"></slot>
    </template>
    <!-- 弹窗尾部插槽 -->
    <template v-if="isFooter" #footer>
      <!-- 自定义尾部插槽组件显示 -->
      <template v-if="$slots.footer">
        <slot name="footer"></slot>
      </template>
      <!-- 默认尾部按钮列显示 -->
      <template v-else>
        <el-button @click="visible = false">{
  
  { props.cancelBtnText }}</el-button>
        <el-button v-for="(item, index) in footerButtons" :key="index" :icon="item.icon" :type="item.type"
          @click="() => btnClickHandle(item)">{
  
  { item.name }}</el-button>
        <el-button type="primary" @click="confirmHandle">{
  
  { props.confirmBtnText }}</el-button>
      
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值