iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue3动态加载对话框的方法实例
  • 857
分享到

vue3动态加载对话框的方法实例

2024-04-02 19:04:59 857人浏览 泡泡鱼
摘要

目录简介常规方式使用对话框异步动态加载使用方式TestModal.Vue使用结果动态操作对话框的实现DzModalService.tsmain.ts总结简介 介绍使用vue3的异步组

简介

介绍使用vue3的异步组件动态管理对话框组件,简化对话框组件使用方式。本文使用的是vue3、typescript、element_plus完成的示例。

常规方式使用对话框

一般情况下,使用对话框组件,会使用v-model进行双向绑定,通过visible变量控制对话框的显示和关闭。常规方式有一个弊端,自定义组件中使用<el-dialog>,需要通过父组件控制自定义组件是否展示。

<template>
  <ElButton type="primary" @click="openGeneral()">常规方式打开Modal</ElButton>
  <el-dialog
             v-model="dialogVisible"
             title="Tips"
             width="30%"
             :before-close="handleClose"
             >
    <span>This is a message</span>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisible = false">Cancel</el-button>
        <el-button type="primary" @click="dialogVisible = false"
                   >Confirm</el-button
          >
      </span>
    </template>
  </el-dialog>
</template>
<script setup lang="ts">
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup

import {ref } from 'vue';
const dialogVisible = ref(false)

const openGeneral=()=>{
  dialogVisible.value=true
}

</script>

异步动态加载

先看使用异步组件进行动态加载对话框的方式。异步组件使用到的是defineAsyncComponent接口,只有使用到这个组件,才会从网络上加载。动态操作使用的useDzModal

使用方式

<template>
  <ElButton type="primary" @click="openTestModalAsync()">动态异步打开TestModal</ElButton>
</template>
<script setup lang="ts">
import { defineAsyncComponent,ref } from 'vue';  
import { ElMessageBox } from 'element-plus';
import { useDzModal } from './dzmodal'

// 异步加载组件
const TestModalAsync = defineAsyncComponent(()=>import('./components/TestModal.vue'))

const dzmodal = useDzModal()

// # 通过dzmodal动态操作对话框
const openTestModalAsync=()=>{
  dzmodal.open(TestModalAsync,{
    name:'张三'
  })
    .then(res=>{
    if(res.type==='ok'){
      ElMessageBox.alert('TestModal点击了确定');
    }else{
      ElMessageBox.alert('TestModal点击了取消');
    }
  })
}

</script>

TestModal.vue

<script setup lang="ts">
  import { Reactive, ref, defineProps } from 'vue'
const emits = defineEmits(['ok','cancel'])
const props = defineProps({
  name: String
});
const dialogVisible = ref(true)

const resultData= reactive({
  type:'ok',
  data:{}
})

</script>

<template>
      <el-dialog
v-model="dialogVisible"
title="TestModal"
width="30%"
>
  <div>通过DzModal打开TestModal</div>
<div>外部传入:{{ name }}</div>
<template #footer>
  <span class="dialog-footer">
    <el-button @click="emits('cancel',{});dialogVisible = false">Cancel</el-button>
<el-button type="primary" @click="emits('ok',{});dialogVisible = false"
>Confirm</el-button
>
  </span>
</template>
</el-dialog>
</template>

<style scoped>
  </style>

使用结果

动态操作对话框的实现

动态操作对话框,主要思路是动态创建虚拟dom节点,将对话框组件渲染到组件上,核心关键点是要动态创建的节点的上下文为当前app上下文vm.appContext = this._app._context

DzModalService.ts

import { App, inject, Plugin, h, render} from 'vue'
import { ComponentOptions } from 'vue';
export const DzModalSymbol =  Symbol()
export class DzModalResult{
  type: 'ok'|'cancel'|'string' = 'ok'
  body?:any= undefined
}

export class DzModalService{
    
  private _app?:App=undefined
  constructor(app:App){
      this._app=app;
  }
  public open(modal:ComponentOptions, props?: any):Promise<DzModalResult>{

    return new Promise((reslove,reject)=>{
      if(!this._app){
        reject('_app is undefined')
        return;
      }
      
      const container = document.createElement("div");
      document.body.appendChild(container)
      
      // 这里需要合并props,传入到组件modal
      const vm = h(modal, {
        ...props,
        onOk:(data?:any)=>{
          // 弹出框关闭时移除节点
          document.body.removeChild(container)
          reslove(this.ok(data));
        },
        onCancel:(data?:any)=>{
          reslove(this.cancel(data));
        }
      });
      // 这里很重要,关联app上下文
      vm.appContext = this._app._context
      render(vm,container);
    });
  }

    
  public ok(data?:any):DzModalResult{
    const result = new DzModalResult();
    result.type='ok';
    result.body=data;
    return result;
  }

  public cancel(data?:any):DzModalResult{
    const result = new DzModalResult();
    result.type='cancel';
    result.body=data;
    return result;
  }
}

export function useDzModal(): DzModalService {
    const dzModal = inject<DzModalService>(DzModalSymbol)
    if(!dzModal){
        throw new Error('No DzModal provided!')
    }
    return dzModal;
}

const plugin: Plugin = {
    install(app:App, options?:{[key:string]:any}){
        const dzModal = new DzModalService(app)
        app.config.globalProperties.$dzModal= dzModal
        app.provide(DzModalSymbol, dzModal)
    }
}

export default plugin;

main.ts

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.CSS'
import DzModal from './dzmodal'
createApp(App)
.use(ElementPlus)
.use(DzModal) // 安装 dzmodal插件
.mount('#app')

总结

使用异步动态加载对话框,父组件无需控制对话框组件的visible属性 , 这样可以简化父组件操作,不在关心对话框组件在什么时间关闭,如果对话框组件需要访问网络,也在子组件中完成。父组件主要做两件事:

  • 通过异步组件方式引入对话框组件
  • 打开对话框组件

到此这篇关于vue3动态加载对话框的文章就介绍到这了,更多相关vue3动态加载对话框内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue3动态加载对话框的方法实例

本文链接: https://www.lsjlt.com/news/144325.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue3动态加载对话框的方法实例
    目录简介常规方式使用对话框异步动态加载使用方式TestModal.vue使用结果动态操作对话框的实现DzModalService.tsmain.ts总结简介 介绍使用vue3的异步组...
    99+
    2024-04-02
  • React创建对话框组件的方法实例
    原生的前端体系创建一个对话框可是再简单不过了。但是如果放到组件化思想下的react体系中,想要制作一个属于自己的对话框还是有一定的麻烦的。主要遇到的问题有两个:一是如何在子组件中创建...
    99+
    2024-04-02
  • Ubuntu18.10模态对话框设置为非附加模式的方法
    这篇文章主要介绍了Ubuntu18.10模态对话框设置为非附加模式的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Ubuntu 18.10系统中窗口的“模态”对话框有两种...
    99+
    2023-06-13
  • java实现动态编译并动态加载的方法
    小编给大家分享一下java实现动态编译并动态加载的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在D盘test目录下有个java文件:AlTest.javap...
    99+
    2023-06-14
  • Bootstrap模态对话框如何只加载一次remote数据
    这篇文章给大家分享的是有关Bootstrap模态对话框如何只加载一次remote数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。摘要: 前端框架 Bootstrap 的模态对话...
    99+
    2024-04-02
  • SpringSecurity实现动态加载权限信息的方法
    ①数据库中资源与角色对应关系,以及角色和用户对应关系如下图所示:  ②实现FilterInvocationSecurityMetadataSource类 (1)List&...
    99+
    2024-04-02
  • 基于Vue+Openlayer实现动态加载geojson的方法
    加载1个或多个要素 <template> <div id="map" style="width: 100vw; height: 100vh"><...
    99+
    2024-04-02
  • vue3+element-plus Dialog对话框的使用与setup 写法的用法
    目录一. 传统写法不使用setup语法糖一. 传统写法不使用setup语法糖 方式一:通过v-model的方式实现子组件的显示与隐藏 父组件的内容 <template> ...
    99+
    2023-05-17
    vue3 element-plus Dialog对话框 vue3  setup
  • php动态库无法加载的解决方法
    这篇文章主要为大家展示了php动态库无法加载的解决方法,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php动态库无法加载的解决方法”这篇文章吧。php有什么用php是一个嵌套的缩写名称,是英文超级...
    99+
    2023-06-06
  • linux加载动态库.so的3种方法
            昨天同事联系我,他部署新版本的MS软件提示找不到动态库。但是他能找到这个动态库文件,但不知道如何加载。这样的问题对于我来说是个再简单不过的问题,但对于一个新手,可能就是个打破头都不知道如何解决的问题。所以我想对这个简单问题,...
    99+
    2023-08-31
    linux 运维 服务器
  • 动态加载css的示例分析
    这篇文章给大家分享的是有关动态加载css的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、方法引用来源和应用此动态加载css方法 loadCss,剥离自Sea.js,并...
    99+
    2024-04-02
  • bootstrap中如何实现动态加载下拉框
    小编给大家分享一下bootstrap中如何实现动态加载下拉框,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实例如下所示://引入...
    99+
    2024-04-02
  • Android动态添加view的方法示例
    由于项目需求菜单写活,效果如下:这里的按钮数量是可变的.png由于不是可滑动控件,我用的百分比布局做的适配 LinearLayout typeLayout = (LinearLayout) headerView.findViewById(R...
    99+
    2023-05-30
    android 动态 添加view
  • Qt专栏之模态与非模态对话框的实现
    一、概念介绍 什么是模态对话框和非模态对话框呢?我们日常使用软件过程中很常见的现象,点击某个软件上某个按钮会弹出对话框窗口,此时对于其他窗口而言: 可以同时对其他窗口进行操作的称为非...
    99+
    2024-04-02
  • vue3组合式api实现v-lazy图片懒加载的方法实例
    目录前置知识Intersection ObserverVue3指令周期image对象思路完整代码总结前置知识 Intersection Observer 浏览器提供api,用于检测目...
    99+
    2024-04-02
  • Android编程实现AlertDialog自定义弹出对话框的方法示例
    本文实例讲述了Android编程实现AlertDialog自定义弹出对话框的方法。分享给大家供大家参考,具体如下:弹出对话框,显示自定义的布局文件弹出对话框提示设置密码或登录密码private void showSetPasswordDia...
    99+
    2023-05-30
    android alertdialog 对话框
  • python中动态加载模块和类方法实现
    python中动态加载模块和类方法实现测试代码   文件名: mytest.py 具体代码如下:   注意:模块名,类名,方法名都是变量。   #coding=UTF-8 class TestClass: def sub(se...
    99+
    2023-01-31
    模块 加载 方法
  • ExtJs 实现动态加载grid完整示例
    Ext3.3完整包 Ext3.3中文文档 数据表的结构是:数据表table > 记录record > 字段 store的结构是: Ext.data.Store > ...
    99+
    2022-11-15
    ExtJs 动态加载grid
  • Android 动态加载 so实现示例详解
    目录背景so动态加载介绍从一个例子出发so库检索与删除动态加载so结束了吗?ELF文件扩展总结背景 对于一个普通的android应用来说,so库的占比通常都是巨高不下的,因为我们无可...
    99+
    2024-04-02
  • vue3.0+vite2实现动态异步组件懒加载的方法
    这篇文章主要介绍“vue3.0+vite2实现动态异步组件懒加载的方法”,在日常操作中,相信很多人在vue3.0+vite2实现动态异步组件懒加载的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue3....
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作