vue实现自定义"模态弹窗"组件实例代码

作者:禾小毅 时间:2024-04-30 10:26:05 

前言

对话框是很常用的组件 , 在很多地方都会用到,一般我们可以使用自带的alert来弹出对话框,但是假如是设计出的图该怎么办呢 ,所以我们需要自己写一个对话框,下面来一起看看详细的实现过程。

效果图

vue实现自定义"模态弹窗"组件实例代码

vue实现自定义"模态弹窗"组件实例代码

以上截图,红色边框部分,表示 “文字、图标或者图片” 是可更改部分

实例代码

一、创建弹窗组件 quitDialog.vue 组件


<template>
 <transition-group name='fade'>
   <!-- 退出弹窗 -->
   <div class="quit_dialog"
        key="1"
        @click="isQuit = false"
        v-if="isQuit"
        @touchmove.prevent>
   </div>
   <div class="quit_box"
        v-show="isQuit"
        key="2">
     <img :src="imgUrl"
          :alt="imgLoadTip">
          <div class="quit_title">{{title}}</div>
     <p>{{content}}</p>
     <button class="quit_btn" @click="leftClick">{{btnText}}</button>
     <button class="quit_close" @click="rightClick">{{rightText}}</button>
   </div>
 </transition-group>
</template>
<script>
export default {
 name: 'Popup',
 data () {
   return {
     isQuit: false,
     imgUrl: '',
     title: '',
     content: '',
     btnText: '',
     rightText: ''
   }
 },
 methods: {
   leftClick () {
     this.leftBtn()
     this.isQuit = false
   },
   rightClick () {
     this.rightBtn()
     this.isQuit = false
   }
 }
}
</script>
<style lang="scss" scoped>
// 退出弹窗
.fade-enter,
.fade-leave-active {
 opacity: 0;
}
.fade-enter-active,
.fade-leave-active {
 transition: opacity 0.35s;
}
// 全局弹窗
.quit_dialog {
 background: rgba(0,0,0,.5);
 position: fixed;
 top: 0;
 left: 0;
 height: 100%;
 width: 100%;
 z-index: 10000;
}

.quit_box {
 width: 700px;
 background: #fff;
 position: fixed;
 top: 50%;
 left: 50%;
 margin-left: -350px;
 margin-top: -190px;
 z-index: 10001;
 border-radius: 10px;
 text-align: center;
 padding: 50px;
 img{
   width: 80px;
 }
.quit_title{
     color: #666;
     font-size: 28px;
     margin: 45px 0px;
 }
 button {
   border-radius: 32px;
   padding:20px 0px;
   font-size: 26px;
   border-radius: 8px;
   width: 214px;
 }
 .quit_btn{
   color: #03BA82;
   background: #fff;
   border: 1px solid #03BA82;
   margin-right: 32px;
 }
 .quit_close {
   background: linear-gradient(0deg, #03BA82, #01D695);
   box-shadow: 0px 3px 4px 0px rgba(1, 84, 58, 0.27);
   border: 1px solid #03BA82;
   color: #fff;
 }
}
</style>

二、创建 graspDialog.js


import Vue from 'vue'
import Grasp from '../components/QuitDialog/QuitDialog'

const PopupBox = Vue.extend(Grasp)

Grasp.install = function (data) {
 let instance = new PopupBox({
   data
 }).$mount()

document.body.appendChild(instance.$el)

Vue.nextTick(() => {
   instance.isQuit = true
   // isQuit 和弹窗组件里的isQuit对应,用于控制显隐
 })
}

export default Grasp

三、在全局 main.js 引入


import Vue from 'vue'
import Popup from './api/quitDialog'
Vue.prototype.$popup = Popup.install

四、页面中调用,只需在函数中调用即可


methods: {
   graspBtn () {
     this.$grasp({
       imgUrl: require('../../assets/home/quits.png'), // 顶部图片.
       imgLoadTip: '图片加载中...',
       content: '温馨提示',
       title: '注意:该学习任务未完成,是否确认退出',
       btnText: '残忍退出',
       rightText: '继续学习',
       // 左边点击事件
       leftBtn: () => {
         this.$store.dispatch('user/logout').then(() => {
           this.$signalr.LogoutPad()
           this.$signalr.SendMsg(2, 0, '退出系统')
           this.$router.push('/login')
         })
       },
       // 右边点击事件
       rightBtn: () => {}
     })
   }
}

来源:https://blog.csdn.net/weixin_50450473/article/details/121904203

标签:vue,自定义,弹窗组件
0
投稿

猜你喜欢

  • 海量数据库的查询优化及分页算法方案

    2024-01-16 18:50:51
  • 有关div页面拖动、缩放、关闭、遮罩效果代码

    2024-04-10 10:45:34
  • 在Node.js下运用MQTT协议实现即时通讯及离线推送的方法

    2024-05-03 15:54:50
  • ASP访问带多个参数的存储过程

    2008-10-14 16:45:00
  • 对MySQL慢查询日志进行分析的基本教程

    2024-01-22 20:32:35
  • Linux/Mac MySQL忘记密码命令行修改密码的方法

    2024-01-26 04:42:12
  • Python使用sftp实现传文件夹和文件

    2021-09-30 12:27:37
  • Python常用模块用法分析

    2022-02-05 05:29:43
  • windows安装TensorFlow和Keras遇到的问题及其解决方法

    2022-04-04 02:14:23
  • JavaScript 获得选中文本内容的方法

    2024-05-03 15:07:18
  • 深度定制Python的Flask框架开发环境的一些技巧总结

    2022-12-29 21:50:22
  • python读取csv文件示例(python操作csv)

    2023-02-28 23:12:02
  • python 成功引入包但无法正常调用的解决

    2022-12-05 19:26:12
  • 解决Pycharm下面出现No R interpreter defined的问题

    2021-03-03 01:33:28
  • em与px的区别以及em特点和应用

    2008-11-11 12:03:00
  • python如何正确的操作字符串

    2023-12-28 02:46:30
  • javascript实现不同颜色Tab标签切换效果

    2024-02-24 16:14:35
  • Python数据类型之List列表实例详解

    2021-01-15 17:06:45
  • Python判断有效的数独算法示例

    2021-10-09 06:37:37
  • 使用Python对IP进行转换的一些操作技巧小结

    2022-09-08 05:13:29
  • asp之家 网络编程 m.aspxhome.com