Vue3全局封装dialog弹框

Vue3全局封装modal弹框使用:

应用场景:全局动态form表单弹框
应用Vue3碎片: ref,reactive,app.component,defineExpose,defineProps,defineEmits
应用UI: element-plus dialog form

一.封装

1.引入
main.js

import App from './App.vue'
import ModalPanel from "@/components/element/ModalPanel.vue";
const app=createApp(App)
app.component('ModalPanel',ModalPanel)

2.使用

  <ModalPanel  
    :defineWidth="defineWidth" 
    :selSingle="selSingle"
    :editTitle="editTitle"
    :editType="editType"
    :editForm="editForm"
    :fixedParam="fixedParam"
    :randomParam="randomParam"
    @updateData="declareData"
    @updateShow="updateSingShow"
    :key="modalPannelKey"
   />

开启

const openModalPannel = () => {
  defineWidth.value=500;
  editType.value="add";
  editTitle.value="操作";
  fixedParam.value=[
  { name:"XX",value:"name"},
  ];
   randomParam.value=[
  { name:"xy",value:"name"},
  ];
}

关闭

const updateSingShow = () => {
  selSingle.value=false;
}

接收

const declareData= (data) => {
   //do...
}

二.具体封装

1.接收参数

const selSingleShow = ref(false);
const props = defineProps({
  defineWidth: {
    required: true,
    type: Number,
    default: 0,
  },
  selSingle: {
    required: true,
    type: Boolean,
    default: "",
  },
  editTitle: {
    required: true,
    type: String,
    default: "",
  },
  editType: {
    required: true,
    type: String,
    default: "",
  },
  editForm: {
    required: true,
    type: Object,
    default: {},
  },
  fixedParam: {
    required: true,
    type: Array,
    default: [],
  },
  randomParam: {
    required: true,
    type: Array,
    default: [],
  },
});
const emit = defineEmits(['updateData','updateShow']);
const formList = reactive([]);

2.初始化值

onMounted(() => {
  if(props!=undefined){
        formList.push(...props.fixedParam);
        formList.push(...props.randomParam);
       selSingleShow.value=props.selSingle;
    }
});

3.关闭弹框

const  updateSingle=()=>{
  emit("updateShow",selSingleShow);
}

4.更新数据

const updateNameChange=(data)=> {
    emit("updateData",data);
}

5.弹框

 <el-dialog
      v-model="selSingleShow"
      :title="editTitle"
      :width="defineWidth"
      align="left">
      <div class="modal-padding">
        <el-form
          ref="ruleFormRef"
          label-width="auto"
          label-position="top"
          :model="editForm"
          :rules="rules"
          class="demo-ruleForm"
        >
        <div v-for="(item, index) in formList">
          <el-form-item :label="item.name" :prop="item.value">
            <el-input v-model="editForm[item.value]" />
          </el-form-item>
        </div>
        </el-form>
      </div>
      <template #footer>
        <div class="modal-footer-padding">
          <el-button  type="primary"
            >确认</el-button
          >
          <el-button >取消</el-button>
        </div>
      </template>
    </el-dialog>

三,交互

1.组件暴露方法

import { ref, reactive, onMounted,defineExpose} from "vue";
defineExpose({
  updateView,
});

2.引入页调用

const ModalRef= ref(null);
const ModalKey= ref(0);
 <ModalPanel  ref="ModalRef" :key="ModalKey"/>

刷新数据


  if(ModalRef.value!=null){
    ModalRef.value.updateViewList() //刷新数据
  }

更新组件

ModalKey.value+= 1;

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据你提供的引用内容,可以看出你想要了解如何在Vue3中封装el-dialog组件。 在Vue3中,你可以自己封装一个类似el-dialog组件。你可以通过使用`<LZDialog>`组件来达到这个目的。在你的代码中,`<LZDialog>`组件具有以下属性和方法: 属性: - `dialogVisible`:控制弹窗是否可见 - `title`:弹窗标题 - `width`:弹窗宽度 - `successBtnText`:确定按钮文本 - `closeBtnText`:取消按钮文本 - `isFooter`:是否显示按钮 方法: - `dialogCloseDef`:关闭弹窗的方法 - `dialogSuccessDef`:确定按钮点击后的方法 你可以根据需要在`dialogCloseDef`和`dialogSuccessDef`方法中处理关闭弹窗和确定按钮点击后的逻辑。 另外,根据你提供的第二个引用内容,可以看出你还需要将`<LZDialog>`组件注册为全局组件,以便在项目中使用。你可以使用`install`方法来实现这个注册。 总结起来,在Vue3中封装el-dialog类似的组件的方法可以参考以下步骤: 1. 创建一个新的组件,例如`<LZDialog>`组件。 2. 在组件中定义所需的属性和方法,例如`dialogVisible`、`title`、`width`等属性,以及`dialogCloseDef`、`dialogSuccessDef`等方法。 3. 在组件中设置模板,包括弹窗的结构和样式。 4. 在需要使用这个组件的地方,通过`<LZDialog>`标签引入并使用。 5. 在项目的入口文件中,通过`install`方法将`<LZDialog>`组件注册为全局组件,以便在整个项目中使用。 希望这个答案能够帮助到你!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue3.x + elementPlus 封装组件dialog弹框封装篇](https://blog.csdn.net/m0_62015496/article/details/125414348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Vue3之对Dialog的简单封装](https://blog.csdn.net/qq_16525829/article/details/128651551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值