相关文章推荐
满身肌肉的高山  ·  vue 报错 ...·  3 月前    · 
谈吐大方的电池  ·  Vue的methods方法中调用另一个方法及 ...·  1 月前    · 
爱吹牛的香烟  ·  vue使用quill编辑器自定义附件上传方法 ...·  1 月前    · 
爱跑步的沙滩裤  ·  PyQt5关闭窗口多线程的退出_pyqt5关 ...·  1 年前    · 
打篮球的香烟  ·  【2023新书】在微控制器上进行深度学习:学 ...·  2 年前    · 
玩足球的大海  ·  linux密码暴力破解之SHA-512破解_ ...·  2 年前    · 
小眼睛的课本  ·  关于java中file.delete不好用的 ...·  2 年前    · 
谈吐大方的太阳  ·  如何处理 MySQL错误码 ...·  2 年前    · 
Code  ›  vue优雅的实现关闭弹框开发者社区
软件 event vue
https://cloud.tencent.com/developer/article/1609392
面冷心慈的开心果
2 年前
作者头像
brzhang
0 篇文章

vue优雅的实现关闭弹框

原创
前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 玩转全栈 > 正文

vue优雅的实现关闭弹框

原创
修改 于 2020-04-03 16:44:31
1.2K 0
举报

背景

假如说,有这样一个页面,一个蒙层,然后上面一个弹框,怎么优雅的去做关闭这个弹框呢?

是的,怎么优雅的关闭这个弹框,是今天的主题。

1、点击 取消 , 确定 按钮,关闭弹框,的的确确,大多数是这样的做法,但是考虑到,用户有可能手指距离这里比较远,所以,操作可能会比较不方便,因此,这种体验似乎并不是很好,所以, 慢慢的用户就觉得需要点击蒙层的时候,也能关闭弹框 。

那么,怎么去实现点击蒙层关闭弹框呢?

1、找到蒙层那个div给蒙层加上 @click='closeDialog',因此,如果你的页面中有很多弹框, 那就意味着,你的页面有几个弹框,就要加几个click事件 ,就问你累不累,在加上取消,确定按钮,想必你肯定开始怀疑人生了。

2、使用全局方式,记得很久之前撸过jquery,jquery里面就一个live绑定事件的功能,大概就是

$(".dialog").live('click',function(){})

以上代码手撸,不保证可用,大概意思就是class为.dialog的element,都绑定一个这样的click事件,不管你当前在不在dom中,后面加进来的也是OK的,想想就觉得挺美好的,那么,可否在Vue中玩一玩呢?

遗憾的是,vue中可没有像jquery种selector的方式,两种框架的本质都不一样,vue中mvvm框架,如果需要用户去像jquery那样找element,本身就显得比较怪怪的,那么怎么办呢?可以这样玩。

document.body.addEventListener('click', event => {
      const className = event.target.className
      const classNameArray = ['tip-operating-layer', 'tip-dialog-wrap']
      if (classNameArray.includes(className)) {
        console.log('关闭浮层')
        this.closeDialog()
 })

我们直接给body绑定了一个click事件,然后event.target.className去比较class,如果是我们弹框的蒙层,就相应这个事件。

所以,你准备在每个页面都加上这一套代码是吗?

我想大多数人肯定是这样想的,难道你没发现,这段代码似乎和业务并没有任何关系,他只是检查是否点击了蒙层而已。因此,这段代码是可以下层的。

问题的关键是,怎么通知到页面去点击到了浮层这样一个事件,并作出相应的处理。

事件总线 在这个时候就起到作用了。

事件总线

const install = function(Vue) {
  const eBus = new Vue({
    methods: {
      emit(event, ...args) {
        this.$emit(event, ...args)
      on(event, callback) {
        console.info('...ebus on triggered...')
        this.$on(event, callback)
      off(event, callback) {
        console.info('...ebus off triggered...')
        this.$off(event, callback)
  Vue.prototype.$ebus = eBus
export default install

你可能角色事件总线是什么很神秘的黑科技,但是我要告诉你的是,他事件上是一个全局单例而已,无非就是你把数据丢给我,我在把数据丢给这种数据的监听者而已,就比如上面这个插件,直接

Vue.use(ebus)

之后,就相当于Vue的原型链上有了这么一个bus的全局实例,嗯,唯一的。

所以,结合我们上面那个对蒙层点击的判断,就好说了

document.body.addEventListener('click', event => {
  const className = event.target.className
  const classNameArray = ['tip-operating-layer', 'tip-dialog-wrap']
  if (classNameArray.includes(className)) {
    this.$ebus.emit('closepop')
})

直接通过事件总线将这个消息发送给关注这个事件的页面,比如A页面。

created() {
  this.$ebus.on('closepop', this.closeAllDialog)
beforeDestroy() {
  this.$ebus.off('closepop')
},

此时具体的业务页面只需要关系我 closeAllDialog 做什么事情就好了,比如,无脑关闭是所有的弹框:

closeAllDialog() {
  this.isOperationShow = false
 
推荐文章
满身肌肉的高山  ·  vue 报错 ReferenceError: exports is not defined - 兔&&大梅
3 月前
谈吐大方的电池  ·  Vue的methods方法中调用另一个方法及this指向问题_vue中实现methods一个方法调用另外一个方法
1 月前
爱吹牛的香烟  ·  vue使用quill编辑器自定义附件上传方法,并根据上传附件名称生成链接_quill 上传附件
1 月前
爱跑步的沙滩裤  ·  PyQt5关闭窗口多线程的退出_pyqt5关闭窗口结束所有线程-CSDN博客
1 年前
打篮球的香烟  ·  【2023新书】在微控制器上进行深度学习:学习如何使用TinyML开发嵌入式AI应用程序 - 专知VIP
2 年前
玩足球的大海  ·  linux密码暴力破解之SHA-512破解_sftp使用ssh512后的密文-CSDN博客
2 年前
小眼睛的课本  ·  关于java中file.delete不好用的问题_踏雪凌冰学习技术的技术博客_51CTO博客
2 年前
谈吐大方的太阳  ·  如何处理 MySQL错误码 1215:无法添加外键约束?-腾讯云开发者社区-腾讯云
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号