下载文件1、弹窗组件

<template>
<view class="bombFrame" v-if="bshow" :class="show?'show':'hide'">
<view class="telate" :class="show?'bshow':'bhide'">
<view class="hint">
<view>{{title}}</view>
<view @touchstart.prevent="noClick">
<image src="./static/cha.svg" mode="" />
</view>
</view>
<view class="promptContent">
<view>
<image src="./static/gantan.svg" mode="" />
</view>
<view>{{content}}</view>
</view>
<view class="operate">
<view @touchstart.prevent="noClick">{{noBtnText}}</view>
<view @touchstart.prevent="yesClick">{{yesBtnText}}</view>
</view>
</view>
</view>
</template>
<script>
/**
*
*
* this.$Message({ content: "模式未保存,确定离开?" })
.then(() => {
console.log("yes");
})
.catch(() => {
console.log("cancel");
});
*
*
*/
export default {
props: {
title: {
type: String,
default: "提示",
},
yesBtnText: {
type: String,
default: "确定",
},
noBtnText: {
type: String,
default: "取消",
},
hasMark: {
type: Boolean,
default: true,
},
content: {
type: String,
default: "此操作将永久删除该文件, 是否继续?",
},
},
data() {
return {
promiseStatus: null,
show: false,
bshow: false,
};
},
methods: {
messag() {
let _this = this;
this.show = true;
this.bshow = true;
return new Promise(function (resolve, reject) {
_this.promiseStatus = { resolve, reject };
});
},
noClick() {
this.show = false;
setTimeout(() => {
this.bshow = false;
}, 500);
this.promiseStatus && this.promiseStatus.reject();
},
yesClick() {
this.show = false;
setTimeout(() => {
this.bshow = false;
}, 500);
this.promiseStatus && this.promiseStatus.resolve();
},
alertClick() {
this.show = false;
setTimeout(() => {
this.bshow = false;
}, 500);
this.promiseStatus && this.promiseStatus.resolve();
},
},
};
</script>
<style lang='scss'>
@keyframes move {
0% {
background: rgba(0, 0, 0, 0.5);
opacity: 1;
}
50% {
background: rgba(0, 0, 0, 0.2);
}
100% {
background: rgba(0, 0, 0, 0);
opacity: 0;
}
}
@keyframes move2 {
0% {
background: rgba(0, 0, 0, 0);
opacity: 0;
}
50% {
background: rgba(0, 0, 0, 0.2);
}
100% {
background: rgba(0, 0, 0, 0.5);
opacity: 1;
}
}
@keyframes move4 {
0% {
background: rgba(255, 255, 255, 1);
transform: translateY(0);
}
50% {
background: rgba(255, 255, 255, 0.5);
}
100% {
background: rgba(255, 255, 255, 0);
transform: translateY(-50rpx);
display: none !important;
}
}
@keyframes move3 {
0% {
background: rgba(255, 255, 255, 1);
transform: translateY(-50rpx);
}
100% {
background: rgba(255, 255, 255, 1);
transform: translateY(0);
}
}
.show {
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
animation: move2 0.5s; /*自定义动画名称*/
animation-fill-mode: forwards; /*动画执行完后的状态*/
}
.hide {
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
animation: move 0.5s; /*自定义动画名称*/
animation-fill-mode: forwards; /*动画执行完后的状态*/
}
.bshow {
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
animation: move3 0.5s; /*自定义动画名称*/
animation-fill-mode: forwards;
}
.bhide {
-webkit-transition: -webkit-transform 1s;
transition: transform 1s;
animation: move1 0.5s; /*自定义动画名称*/
animation-fill-mode: forwards; /*动画执行完后的状态*/
}
.bombFrame {
position: fixed;
z-index: 9900;
width: 100vw;
height: 100vh;
top: 0;
left: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0px 2px 9px 3px rgba(0, 0, 0, 0.5);
.telate {
background-color: #fff;
border-radius: 20rpx;
width: 700rpx;
padding: 30rpx;
box-sizing: border-box;
.hint {
display: flex;
align-items: center;
justify-content: space-between;
> view:nth-child(1) {
color: #303133;
font-size: 32rpx;
}
> view:nth-child(2) {
width: 50rpx;
height: 50rpx;
image {
width: 100%;
height: 100%;
}
}
}
.promptContent {
display: flex;
align-items: center;
margin-top: 30rpx;
> view:nth-child(1) {
width: 50rpx;
height: 50rpx;
image {
width: 100%;
height: 100%;
}
}
> view:nth-child(2) {
color: #606266;
font-size: 28rpx;
margin-left: 25rpx;
}
}
.operate {
display: flex;
justify-content: end;
margin-top: 30rpx;
> view:nth-child(1) {
padding: 15rpx 30rpx;
font-size: 24rpx;
border-radius: 6rpx;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
}
> view:nth-child(2) {
padding: 15rpx 30rpx;
font-size: 24rpx;
margin-left: 20rpx;
border-radius: 6rpx;
background: #009788;
border: 1px solid #dcdfe6;
color: #ffffff;
}
}
}
}
</style>

2、往vue中挂载组件 (创建js)

import Vue from 'vue'
import messag from './index.vue'
const VueComponent = Vue.extend(messag);
const vm = new VueComponent().$mount();
let init = false;
let defaultOptions = {
yesBtnText: '确定',
noBtnText: '取消'
}; const message = function (options) {
Object.assign(vm, defaultOptions, options, {
type: 'confirm'
});
if (!init) {
document.body.appendChild(vm.$el);
init = true;
}
return vm.messag();
}; export default message;

3、应用全局组件
3.1 在main.js中引入全局

import Message from '@/components/message/index'
Vue.prototype.$Message = Message;
 
3.2 页面中使用组件
this.$Message({ content: "模式未保存,确定离开?" })
.then(() => {
console.log("yes");
}).catch(() => {
console.log("cancel");
});

vue封装全局确认弹窗的更多相关文章

  1. echars vue 封装全局组件 曲线 柱状图 同v-chars绿色系 配置样式

    Echars vue封装 ,曲线图 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  2. 用vue2.x注册一个全局的弹窗alert组件

    一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...

  3. main.js中封装全局登录函数

    1. 在 main.js 中封装全局登录函数 通过 vue 对象的原型扩展,可以扩展一个函数,这样这个函数就可以在每一个界面通过类似指向对象的方式,去访问这个函数. 如下是 main.js 扩展的函数 ...

  4. Vue列表组件与弹窗组件示例

    列表组件 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <me ...

  5. 用vue2.x注册一个全局的弹窗alert组件、confirm组件

    一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...

  6. [转]Vue项目全局配置微信分享思路详解

    这篇文章给大家介绍了vue项目全局配置微信分享思路讲解,使用vue作为框架,使用vux作为ui组件库,具体内容详情大家跟随脚本之家小编一起学习吧 这个项目为移动端项目,主要用于接入公众号服务.项目采用 ...

  7. 浅析vue封装自定义插件

    在使用vue的过程中,经常会用到Vue.use,但是大部分对它一知半解,不了解在调用的时候具体做了什么,因此,本文简要概述下在vue中,如何封装自定义插件. 在开始之前,先补充一句,其实利用vue封装 ...

  8. Vue 封装axios(四种请求)及相关介绍(十三)

    Vue 封装axios(四种请求)及相关介绍 首先axios是基于promise的http库 promise是什么? 1.主要用于异步计算 2.可以将异步操作队列化,按照期望的顺序执行,返回符合预期的 ...

  9. 11 vue 自定义全局方法

    //global.js// 定义vue 全局方   // 定义vue 全局方法 建议自定义的全局方法加_ 以示区分 export default {   install(Vue, options =  ...

  10. vue封装公用弹出框方法,实现点击出现操作弹出框

    vue封装公用弹出框方法,实现点击出现操作弹出框 如上图所示,这次要实现一个点击出现操作弹框的效果:并将这个功能封装成一个函数,便于在项目的多个地方使用. 具体思路是: 封装一个组件,组件保护一个插槽 ...

随机推荐

  1. python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例

    实现思路 1.抓取api信息(目前公司用的swagger),uri.method.params.response,解析完成后写入excle 2.读取抓取完毕的api信息,处理为allpairs所需要的 ...

  2. Unity之语音识别

    Unity之语音识别 前言 开篇 Unity版本及使用插件 正题 写脚本 挂载到游戏场景中 结尾 唠家常 今日无推荐 前言 开篇 今儿心情好,哈哈哈哈哈 今天小黑给大家带来Unity的语音识别功能,超 ...

  3. 继承与多态 动手动脑3方法覆盖(override)”的要点

    方法覆盖(override)"的要点 方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)! 在子类中,若要调用父类中被覆盖的方法,可以使用super关键字. 以下子类 ...

  4. steamdeck使用SSH远程控制

    为了方便去折腾steamdeck,我想用Windows11远程控制steam deck,我开始在网上查找Linux远程控制的方法,决定使用SSH来达到目的. 首先开始查看我的steamdeck的ip地 ...

  5. 五大数据类型 - 字符串 - 列表 list - 集合set - 有序集合 - 哈希 hashMap

    基础知识 redis默认有16个数据库:默认使用的是第0个. 可以使用select num切换 查看DB大小 DBSIZE 查看所有的key **keys ** 清空当前数据库 flushdb 清空全 ...

  6. EPICS Archiver Appliance在Debian11下安装文档

    本文很想标注转发,可是要转发链接,只好标注原创. 首先声明:本文档是合肥光源控制组孙晓康博士踩坑后整理的.我尝试过在Debian11和Rocky下安装,碰到坎过不去,这段时间各种事就没继续了,请教晓康 ...

  7. quasar打包时:Module not found: Can't resolve imported dependency "dayjs/plugin/customParseFormat"

    运行quasar build -m electron 后,报错如下: 看了这篇webpack 编译 element-plus 报错后,找到了报错的根源所在 于是,在quasar官方文档找到了针对web ...

  8. 基于SpringBoot实现操作GaussDB(DWS)的项目实战

    摘要:本文就使用springboot结合mybatis plus在项目中实现对GaussDB(DWS)的增删改查操作. 本文分享自华为云社区<基于SpringBoot实现操作GaussDB(DW ...

  9. JZOJ 1121. Fix

    解析 考场时想多了,其实根本不用分阶段 一维状压 \(DP\) 就行了 可我没想清楚,加了个第几次去稳固一个点的阶段 然后时间就炸了!!! \(Code\) #include<cstdio> ...

  10. 前端开发工具VsCode官网下载太慢?直接失败?

    我有个朋友来到公司以后,在搭建基本开发环境时,什么nodejs安装包,vscode包等等都是由同事直接分享,然后一键安装,从来没去过官网下载,以至于想更新新版本的时候首次进入官网有点懵逼,相信很多同学 ...