当前位置: 首页 > article >正文

【记录】vue 添加全局 dialog 弹框

页面展示

在这里插入图片描述

代码

@/components/GlobalDialog/index.vue

<template>
  <div class="global_dialog" v-if="isVisible">
    <div class="global_dialog_header">
      <div class="global_dialog_header_title">{{ title }}</div>
      <i class="el-icon-close" @click="closeDialog" />
    </div>

    <div class="global_dialog_slot">
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  name: 'GlobalDialog',
  props: {
    isVisible: {
      type: Boolean,
      default: false
    },
    title: {
      type: String,
      default: ''
    }
  },
  methods: {
    closeDialog() {
      this.$emit('close')
    }
  }
}
</script>

<style scoped lang="scss">
.global_dialog {
  max-width: 20vw;
  padding: 20px;
  position: fixed;
  right: 10px;
  bottom: 10px;
  z-index: 999;

  box-shadow: 0 0 3px 3px #ccc;
  border-radius: 5px;

  background-color: #fff;

  &_header {
    margin-bottom: 10px;
    display: flex;
    justify-content: space-between;
    font-size: 16px;
    &_title {
      margin-right: 20px;
      font-weight: bold;
    }
    .el-icon-close {
      cursor: pointer;
    }
  }
  &_slot {
    white-space: pre;
    line-height: 25px;
  }
}
</style>

@/plugins/global-dialog.js

import GlobalDialog from '@/components/GlobalDialog'

export default {
  install(Vue, options) {
    // 创建一个新的Vue实例作为全局弹框
    const ModalConstructor = Vue.extend(GlobalDialog)
    let modalInstance = new ModalConstructor({
      el: document.createElement('div'),
      propsData: {
        isVisible: false
      }
    })

    // 添加方法来显示弹框
    Vue.prototype.$showGlobalDialog = (content, props) => {
      modalInstance.isVisible = true
      Object.keys(props).forEach((key) => {
        modalInstance[key] = props[key]
      })
      modalInstance.$slots.default = [content] // 插入内容
      document.body.appendChild(modalInstance.$el)
    }

    Vue.prototype.$hideGlobalDialog = () => {
      modalInstance.isVisible = false
    }

    // 监听关闭事件来隐藏弹框
    modalInstance.$on('close', () => {
      modalInstance.isVisible = false
    })
  }
}

main/js

import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
import store from './store/index'

// ...

import GlobalDialog from './plugins/global-dialog.js' // 【主要代码】
Vue.use(GlobalDialog); // 【主要代码】


router.beforeEach((to, from, next) => {
  /** ** 作为子系统处理 start ****/
  if (to.path === '/login') {
    // 进入登陆页关闭全局弹框
    Vue.prototype.$hideGlobalDialog() // 【主要代码】
  }
})

new Vue({
  router,
  store,
  render: (h) => h(App)
}).$mount('#app')

使用全局组件

this.$showGlobalDialog(
  `待办预警:${res.data.superviseTaskCount || 0} 条\n待办巡查:${res.data.patrolTaskCount || 0}`,
  {title: '待办提醒'}
)

http://www.kler.cn/a/460455.html

相关文章:

  • C++ 并发专题 - std::promise 和 std::future 介绍
  • Windows 11 系统中npm-cache优化
  • AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲
  • SQL 中的 EXISTS
  • 网络安全态势感知
  • 【prometheus】【blackbox_exporter】grafna导入blackbox_exporter看板配置
  • .net core 的正则表达式
  • 数据挖掘笔记 | 插值 | 拉格朗日插值 | 龙格现象 | 埃尔米特插值 | 分段三次埃尔米特插值
  • Appium2.0:发生了哪些重大变化?
  • Linux umami网站统计工具自定义API开发
  • 科技云报到:洞见2025年科技潮流,技术大融合开启“智算时代”
  • 计算机网络——网络安全_计算机网络安全
  • 【Java 新特性】常用函数式接口
  • npm istall 卡住的结解决方法
  • React之从0开始(2)
  • Linux 安全加固的10个常用脚本
  • 数据结构(链式栈)
  • 【玩转23种Java设计模式】行为型模式篇:命令模式
  • 二十三种设计模式-单例模式
  • FQ-GAN代码解析
  • HarmonyOS-面试整理
  • Day2 微服务 网关路由转发、网关登录校验、配置管理
  • 小程序基础 —— 07 创建小程序项目
  • 基于Flask后端框架的均值填充
  • 计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设
  • Maven的依赖Scope详细解释