Vue弹窗 Confirm 组件

2023-10-27

Vue的弹窗组价

描述:有时候自己开发项目,需要使用到一些弹窗,提示框之类的东西。一般会有我们自己使用一些UI组件库,或者自己手写一个。
哈哈,用别人的东西有时候挺好的,但是有时候又不好,因为业务的需求和UI的设计总是变化的很快,别人的东西难免改起来很多时候感觉还不如自己写(反正很多时候我都是这样的感觉,特别是踩到坑时,往往觉得莫名其妙,不知如何是好,但是自己写的东西不一样,可以调试)。所以这里还是决定自己造一个轮子。
本文章东西不会讲的太深,但是感觉写完,遇到的问题还是挺有意思的。
模仿了VUX的风格,上一个效果图:

这里写图片描述

这里写图片描述

注:本文章所描述的东西只限于 Vue 的项目参考。

使用

代码会在后面给出,其实就是一个 .vue 文件的内容,你只要在项目新建一个文件,就像引入自己的组件一样就可以。唯一需要注意的就是父元素的调用方式和VUX的不太一样(如果你曾使用过的话),个人觉得VUX的方式在使用的时候声明的变量有点多,特别是引入了Alert,Toast,Spinner等组价以后,就需要声明很多额外的变量控制,比较乱,所以换了一种调用方式,使用时,只要:

  1. import 引进 Confirm 组件,假设组件名是:Confirm;
  2. 给组价一个 ref 的引用,比如:<confirm ref="myConfirm"></confirm>
  3. 然后父组件只要通过:this.$refs.myConfirm.show(content, configObj) 或者 this.$refs.myConfirm.hidden() 开启和关闭弹窗就好,至于控制里面的内容,就在 show 方法通过配置就好。后面会给出详细的配置信息。

这样设计交互的好处就是减少了中间和控制变量的声明,使用更方面一些。

代码

<template>
  <transition name="confirm-fade">
    <div v-if="isShowConfirm" class="my-confirm" @click.stop="clickFun('clickCancel')">
      <div class="confirm-content-wrap" @click.stop>
        <h3 class="my-confirm-title">{{ titleText }}</h3>
        <p class="my-confirm-content">{{ content }}</p>
        <div class="my-operation">
          <div v-if="type==='confirm'" class="my-cancel-btn" @click="clickFun('clickCancel')">
            <p class="my-btn-text my-border-right">{{ cancelText }}</p>
          </div>
          <div class="confirm-btn" @click="clickFun('clickConfirm')">
            <p class="my-btn-text">{{ confirmText }}</p>
          </div>
        </div>
      </div>
    </div>
  </transition>
</template>

<script type="text/ecmascript-6">
export default {
  data () {
    return {
      isShowConfirm: false, // 用于控制整个窗口的显示/隐藏
      titleText: '操作提示', // 提示框标题
      content: 'Say Something ...', // 提示框的内容
      cancelText: '取消', // 取消按钮的文字
      confirmText: '确认', // 确认按钮的文字
      type: 'confirm', // 表明弹框的类型:confirm - 确认弹窗(有取消按钮);alert - 通知弹框(没有取消按钮)
      outerData: null // 用于记录外部传进来的数据,也可以给外部监听userBehavior,事件的函数提供判断到底是哪个事件触发的
    }
  },
  methods: {
    show (content, config) {
      this.content = content || 'Say Something ...'

      if (Object.prototype.toString.call(config) === '[object Object]') {
        // 确保用户传递的是一个对象
        this.titleText = config.titleText || '操作提示'
        this.cancelText = config.cancelText || '取消'
        this.confirmText = config.confirmText || '确认'
        this.type = config.type || 'confirm'
        this.outerData = config.data || null
      }

      this.isShowConfirm = true
    },
    hidden () {
      this.isShowConfirm = false
      this.titleText = '操作提示'
      this.cancelText = '取消'
      this.confirmText = '确认'
      this.type = 'confirm'
      this.outerData = null
    },
    clickFun (type) {
      this.$emit('userBehavior', type, this.outerData)
      this.hidden()
    }
  }
}
</script>

<style scoped>
  .my-confirm {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 998;
    /* 这里防止当用户长按屏幕,出现的黑色背景色块,以及 iPhone 横平时字体的缩放问题 */
    -webkit-text-size-adjust: 100%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
  }

  /* 进入和出去的动画 */
  .confirm-fade-enter-active {
    animation: opacity 0.3s;
  }
  .confirm-fade-enter-active .confirm-content-wrap {
    animation: scale 0.3s;
  }
  .confirm-fade-leave-active {
    animation: outOpacity 0.2s;
  }

  /* 包裹层容器样式 */
  .confirm-content-wrap {
    position: absolute;
    top: 28%;
    left: 0;
    right: 0;
    width: 280px;
    margin: 0 auto;
    background-color: #fff;
    border-radius: 5px;
    z-index: 999;
    user-select: none;
  }

  /* 顶部标题部分 */
  .my-confirm-title {
    padding-top: 20px;
    text-align: center;
    font-size: 20px;
    font-weight: 500;
    color: #333;
  }

  /* 中间内容部分 */
  .my-confirm-content {
    padding: 0 15px;
    padding-top: 20px;
    margin-bottom: 32px;
    text-align: center;
    font-size: 16px;
    color: #666;
    line-height: 1.5;
  }

  /* 底部按钮样式 */
  .my-operation {
    display: flex;
    border-top: 1px solid #eee;
  }
  .my-operation .my-cancel-btn, .confirm-btn {
    flex: 1;
  }
  .my-operation .confirm-btn {
    color: #ffb000;
  }
  .my-operation .my-btn-text {
    text-align: center;
    font-size: 16px;
    margin: 14px 0;
    padding: 6px 0;
  }

  /* 其他修饰样式 */
  .my-border-right {
    border-right: 1px solid #eee;
  }

  /* 进来的动画 */
  @keyframes opacity {
    0% {
      opacity: 0;
    }
    100% {
      opacity: 1;
    }
  }
  @keyframes scale {
    0% {
      transform: scale(0);
    }
    60% {
      transform: scale(1.1);
    }
    100% {
      transform: scale(1);
    }
  }

  /* 出去的动画 */
  @keyframes outOpacity {
    0% {
      opacity: 1;
    }
    100% {
      opacity: 0;
    }
  }
</style>

属性

这里的属性放置于 this.$refs.myConfirm.show(content, configObj) 中的参数。

  • titleText (String) 弹框的提示标题
  • content (String) 弹框的主体内容
  • confirmText (String) 弹框的确认按钮文字
  • cancelText (String) 取消按钮文字
  • type (confirm | alert) 弹窗的类型:带取消按钮的确认框和不带取消按钮的确认框
  • outerData (*) 外部传进来的数据,会在用户点击确认按钮时,原封不动的发送出去,便于做一些数据交互,也可以用于区分多个弹窗

事件

这里只提供一个事件供用户点击确认/取消按钮,只有一个事件,怎么区分呢?
答案就在事件提供的参数里面:

<confirm ref="myConfirm" @userBehavior="userBehaviorFun"></confirm>

userBehavior 事件会默认提供两个参数 : typedata

其中type只可能是一下两个值之一

  1. clickCancel 用户点击了确认按钮
  2. clickCancel 用户点击了取消按钮,也有可能是点击了背景遮罩,都认为是为无效的取消按钮

data 的值,就是用户出传进来的东西,用途广泛,可以是下一步函数的参数,也可以是区分多个弹框的逻辑

不带取消按钮的弹框

因为默认的弹框是带取消按钮的,所以只要给 show() 方法中传入第一个内容参数基本就好,比较简单,就不说了。
但是有时候需要仿照 Alert 框给用户一个,仅仅只是通知的弹框,此时只需要配置一会就好:

this.$refs.confirmRefs.show('注册成功!', {
    type: 'alert',
    confirmText: '确定',
    titleText: '消息提示',
    data: '我是外界传进来的数据'
})

效果就是开始的第二站图片。至此,弹框的部分就算是基本结束了!

画外音

这里组件几乎快要完成的时候,通过手机真机测试的时候发现一写小问题,这里没有办法截图。就是当用户点击按钮的时候(弹框的其他内容也会)会出现一个半透明的黑色背景,虽然不影响使用,但是看着就是很不爽,百度了一下,还是解决了,移动端一直就会出现的问题,不过解决起来也很容易,只要加上:

html,body{
    -webkit-text-size-adjust: 100%;
    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

就好哦,详情看这里:移动端HTML5点击事件闪现灰色背景解决方案

所以,这里做下来,自己写了一遍,感觉还是收获了很多东西,虽然只是一个很简单的弹框,需要真的写好还是不容易的,希望大家看到了,可以多动手写一些。不至于平时在工作中遇到问题无从下手。

困了死了,今天是周五团队TB了,吃了大庙火锅,味道不错,喝了点啤酒,催着空调,现在加班写这个感觉整个人都是飘飘然,中间肯定有很多东西被我忽略了。
哎,溜了…

版本记录:
2018/09/15 00:12 发布博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue弹窗 Confirm 组件 的相关文章

  • vmware一打开虚拟机就蓝屏

    win10的更新又和Vmware起了冲突 更新系统后再用Vmware打开虚拟机会立马蓝屏并重新启动 此时最简单的解决方法就是升级Vmware到16版本就可以解决
  • Git 修改已提交 commit 的信息

    背景 由于 Github 和公司 Git 使用账号不一样 偶尔没注意 提交出错后就需要修改 commit 信息 修改最后一次提交 commit 的信息 修改最近提交的 commit 信息 git commit amend message m
  • gbdt matlab,python数据分析学习笔记(三):文件读取&绘图&机器学习调包

    pandas read csv函数 http pandas pydata org pandas docs stable generated pandas read excel html matplotlib inline的作用 matplo
  • Radius认证协议(一)

    简介 为大量用户管理分散的串行线和调制解调器池需要重要的管理支持 由于调制解调器池定义为与外部世界的链接 因此需要特别关注其安全 授权和计费 这可以通过管理单个的用户数据库来实现 该数据库可以进行认证 验证用户名和密码 以及向用户提供的服务
  • Serverless架构模式简介

    Serverless架构模式简介 一 简介 Serverless是一种无服务的架构 类似aws lambda Serverless与跟传统架构不同 由开发者实现的服务端逻辑运行在无状态的计算容器中 它是由事件触发 短暂的 可能只存在于一次请
  • OpenWRT 恢复出厂设置

    输入 firstboot 输入 y 输入 重启 reboot
  • 安装虚拟机提示“无法安装服务VMAuthdService”,请确保您有足够的权限安装系统服务

    以下内容仅供参考 我的情况是 1 Win7 安装过VM12 2 无法安装服务VMAuthdService 3 服务 中 VMAuthdService这项没有消失 不排除仅 以管理员 尝试 net stop VMAuthdService ta
  • cas-overlay-template-5.3 集成Oauth2.0

    第一步 在pom xml 文件添加oauth2 0协议支持
  • 创建第一款iPhone应用程序

    现在让我们来创建一个在iOS模拟器上运行的简单视图应用 空白的应用程序 操作步骤如下 1 打开Xcode并选择创建一个新的Xcode项目 2 然后选择单一视图应用程序 3 接下来输入产品名称即应用程序名称 组织名称和公司标识符 4 确定已经
  • reid数据集

    https blog csdn net qiuchangyong article details 82219775 最近一段时间在做行人重识别方向的研究 行人重识别 Person Re Identification 作为图像识别领域的一个分
  • python中super()出现的TypeError: must be type, not classobj

    python中super 只能应用于新式类 而不能应用于经典类 否则会出现报错 TypeError must be type not classobj Python 2 x中默认都是经典类 只有显式继承了object才是新式类 Python
  • 【ROS机器人系统】自主导航+YOLO目标检测+语音播报

    文章目录 注意事项 一 总体功能设计 二 实验环境 三 演示 四 场景搭建 建图与导航模块 4 1 场景搭建 4 2 小车模型 4 3 导航模块 1 安装依赖 2 从github下载的文件中的test ws目录下 3 运行导航功能 五 YO
  • 图像标签Day02

    1 常见的图像格式 JGP GIF PNG BPM位图 img src resources image 图像标签 jpg alt 基神头像 title 基基哥 width 8
  • springcloud配置nacos启动报错

    报错1 2022 06 09 22 07 27 934 ERROR 15656 main c a cloud nacos NacosConfigProperties create config service error propertie
  • python把路径中反斜杠'\'变为'/'

    windows文件的路径是按反斜杠 分开的 例如 C ProgramData Microsoft Windows Start Menu Programs Xmanager 5 linux总文件路径是使用 分开 例如 home usernam
  • ubutu虚拟机和主机共享同一网络

    ubutu虚拟机和主机共享同一网络 前言 一 使用场景 二 vmware设置 三 主机windows设置 四 虚拟机ubuntu配置 前言 本文采用的是共享同一网卡的方式达到虚拟机使用和主机一样的网络的目的 主要参考了虚拟机共享主机网卡连接
  • loading加载

  • 浅谈 axios ajax fetch

    原生ajax 创建异步对象 var xhr new XMLHttpRequest 设置请求基本信息 并加上请求头 xhr setRequestHeader Content type application x www form urlenc
  • 2014年底总结

    这是第一次写年底总结 其实每年一直都有年底写总结的想法 可总是手头的事情很多 最终计划赶不上变化 最后写总结的想法就不了了之了 今天手头上没有什么工作 趁着现在有些空闲的时间 赶紧开始动笔了 其实很多事情不是没时间做 而是我们的惰性成功了

随机推荐

  • 图像处理那些算法

    图像的几何变换 1 旋转 借助矩阵运算来实现图像的旋转功能 2 平移 借助矩阵运算来实现图像的旋转功能 3 对称 借助矩阵运算来实现图像的对称功能 水平镜像变换 垂直镜像变换 图片裁剪 借助 get gca currentPoint 获取鼠
  • Liunx - 安装maven

    一 使用步骤 1 下载安装 maven官网 https maven apache org download cgi 上传至云服务中 我使用的连接工具 MobaXterm Personal 一键上传 选择你要安装的路径新建maven文件夹 新
  • 【软件测试】软件测试方法之黑盒测试方法和白盒测试

    白盒测试方法 一 概念 白盒测试也称结构测试或逻辑驱动测试 是针对被测单元内部是如何进行工作的测试 它根据程序的控制结构设计测试用例 主要用于软件或程序验证 它可以形象得用下图表示 二 白盒测试方法应该遵循的原则 保证一个模块中的所有独立路
  • exif-js读取图像的元数据(以取经纬度、方位角为例)

    参考文档 安装 npm install exif js save 引用 import EXIF from exif js 使用 EXIF getData document getElementById imgElement function
  • vue聊天功能模块(九)艾特功能实现

    预览 艾特开始 思路 输入ctrl 弹出群成员列表弹框 点击成员时 把成员名称添加到输入框 同时隐藏弹框 1 点击弹框外任意位置 把弹框关闭即可 2 点击删除键时 把 和名称删掉 3 要实现艾特提示 输入框显示的是 某某某 实际发出去的消息
  • HttpClient 之 发送Https请求

    HttpClient包是一个优秀的Http请求的开源jar 本文Http工具类的封装基于HttpClient 封装后的工具类支持Https请求 但是由于项目的需要快速的实现 以下代码还可能会有点过时 但是要是可行的 并且相对比较简单 1 实
  • 小程序组件化开发

    前言 随着小程序的普及 越来越多的开发者开始使用小程序进行开发 而小程序的组件化开发已经成为了一种标配的开发模式 本文将深入介绍小程序组件化开发的相关知识 包括组件的定义 生命周期 通信和使用等方面 帮助大家更好地理解和使用小程序的组件化开
  • 图解SimCLR框架,用对比学习得到一个好的视觉预训练模型

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 amitness 编译 ronghuaiyang 正文共 3027 字 33 图 预计阅读时间 9 分钟 导读 有点像词向量预训练模型 这个框架可以作为很多视觉相关的任务的预训练
  • [Qt] QString 和 String 字符串的相互转换

    QString gt String string str qstr toStdString String gt QString QString qstr QString fromStdString str
  • 微信支付本地调试

    经过折腾几天 找了一些资料来看 我不得不吐槽微信这个团队在做文档是如何槽糕 文档做的不好其次 接口那些总体而言 让人感觉很难受 而且给出的方案不是最优而是最麻烦的 和开发者互动很少 开放平台像是一个爱理不理的平台 这几天收集了一些问题记录一
  • 竞赛选题 基于机器视觉的银行卡识别系统 - opencv python

    1 前言 优质竞赛项目系列 今天要分享的是 基于深度学习的银行卡识别算法设计 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 更多资料 项目分享 https gitee com dancheng senior postgraduate
  • java canvas 动态画图_手把手教你用canvas画动态直线

    自己闲来无事的时候 就想学学热火了好久的H5 然后就看了下canvas 不看不知道 一看下一条 H5我以为没啥 原来都开始提供各种接口和函数了 我滴乖乖 canvas主要是用来画图的 结合定时器 setInterval 函数能够作出精美的动
  • (综述,讲得很好)基于3DMM的三维人脸重建技术总结

    深度学习全监督重建方法 由于真实的三维人脸和二维人脸图像对非常缺乏 采集成本高 很难得到真实二维三维图像对 通常将多张照片进行model fitting求解生成了对应的三维人脸模型 将其作为真值 Ground Truth 从而得到了二维三维
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • kubernetes的学习—部署 Dashboard

    部署 Dashboard Dashboard的介绍 Dashboard 仪表盘 是基于网页的 Kubernetes 用户界面 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中 也可以对容器应用排错 还能管理集群
  • Java——第一个窗口程序

    代码演示 package Gui import java awt GUI的第一个界面 public class TestFrame public static void main String args Frame f1 new Frame
  • 加密网络空间安全厂商“观成科技”获数千万A轮融资,方广资本领投

    近日 观成科技宣布完成数千万A轮融资 方广资本领投 老股东奇安投资跟投 进化资本担任财务顾问 此次融资将主要用于进一步加大研发和技术研究的投入 持续提升产品的竞争力和服务能力 观成科技是一家致力于以守护加密网络空间安全为使命 以加密流量检测
  • Windows下Java实现语音播放

    链接 https pan baidu com s 1BhXGCBSifLxCLDsZ Q8Rpw 提取码 dgbg 64位操作系统 下载jocab 放入jdk安装目录bin目录下 Maven依赖
  • Linux上安装tenginx

    1 下载tengine http tengine taobao org download cn html 2 将文件上传到 opt tengine的目录上 tengine目录是自定义目录 3 解压包 并进入解压后的文件目录下 4 编译环境准
  • Vue弹窗 Confirm 组件

    Vue的弹窗组价 描述 有时候自己开发项目 需要使用到一些弹窗 提示框之类的东西 一般会有我们自己使用一些UI组件库 或者自己手写一个 哈哈 用别人的东西有时候挺好的 但是有时候又不好 因为业务的需求和UI的设计总是变化的很快 别人的东西难