vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍


Posted in Javascript onSeptember 29, 2018

vue如何简单的实现弹框,遮罩,点击其他区域关闭弹框, 简单的思路是以一个div作为遮罩, 控制其的v-if(v-show)即可, 掌握到技巧既可以任意扩展。

v-if 是直接删除dom节点, 就是这个div就不存在了

v-show 是控制dom的css样式设置为 display: none; 来实现,dom还是存在;

实现如下

maskshow来控制控制遮罩的显示隐藏,绑定一个时间点击遮罩的时候关闭它

<div class="mask" v-show="maskShow" @click="setMaskShow">
</div>

有一个弹框它的显示和遮罩一样,里面有个关闭按钮也可以关闭弹框,函数里只需要将maskShow值取反即可

<div class="child" v-show="maskShow">
 <button @click="setMaskShow">关闭</button>
</div>

其他方法

点击时候触发该方法, 判断点的区域

hidePanel(event) {
  let dom = document.getElementById("child");
  if (dom) {
    if (!dom.contains(event.target)) {
    //这句是说如果我们点击到了id为child以外的区域
      this.maskShow = false;
    }
  }
}

全部代码如下

<template>
  <div class="father">
    <div class="mask" v-show="maskShow" @click="setMaskShow"></div>
    <div class="child" id="child" v-show="maskShow">
      <button @click="setMaskShow">关闭</button>
    </div>
    <button @click="setMaskShow">click</button>
  </div>
</template>

<script>
export default {
  data: function(){
    return {
      maskShow: false,
    }
  },
  methods: {
    setMaskShow(){
      this.maskShow = !this.maskShow;
    }
  }
}
</script>

<style>
.father{
  width: 100%;
  height: 100%;
}
.mask{
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  background: #000;
  opacity: 0.3;
}
button{
  width: 100px;
  height: 40px;
  line-height: 40px;
  text-align: center;
}
.child{
  position: fixed;
  width: 400px;
  height: 400px;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 400px;
  top: calc(50% - 200px);
 left: calc(50% - 200px);
  background: #fff;
}
</style>

下面谈谈 Vue.js 里 v-if 与 v-show 的区别

 在 Vue 项目中,v-if 和 v-show 算是两个用得很频繁的指令,很巧的是它俩在表现上也相似,都是动态显示 DOM 元素。不过既然是两个不同指令,肯定会有不同的适用场景,带着好奇,让我们在 Vue 官方文档里一探究竟吧~

对于v-if大家应该不会陌生,不管哪种编程语言都会有 if-else 的流程控制。
例如,在 Java 中:

if (condition) {
  //some code here
} else {
  //some code here, too
}

当然在 Vue.js 中,v-if 也是执行这样的功能。稍有不同的是在 template 中用 v-if 条件渲染一整组,类似地,同时也可使用 v-else 指令来表示 v-if 的 “else块”:

<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>

另一个用于根据条件展示元素的选项是 v-show 指令,用法大致一样:

<h1 v-show=true>Hello!</h1>

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 display 属性。
看到这里大家应该对 v-if 与 v-show 的区别有一个简单的概念了。

接下来将会为大家详细介绍两者的不同:

v-if 是”真正的”条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。
同时 v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。
相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。 

所以一般来说,v-if 具有更高的切换开销,而 v-show 具有更高的初始渲染开销。

因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件不太可能改变,则使用 v-if 更好。

总结

以上所述是小编给大家介绍的vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
Apr 06 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
AngularJS入门教程(零):引导程序
Dec 06 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
Mar 03 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
JavaScript错误处理和堆栈追踪详解
Apr 18 Javascript
解决vue router组件状态刷新消失的问题
Aug 01 Javascript
微信小程序实现留言板
Oct 31 Javascript
layui 监听select选择 获取当前select的ID名称方法
Sep 24 Javascript
vant时间控件使用方法详解
Dec 24 Javascript
vue backtop组件的实现完整代码
Apr 07 Vue.js
vue使用v-for实现hover点击效果
Sep 29 #Javascript
vue 利用路由守卫判断是否登录的方法
Sep 29 #Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
Sep 29 #Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 #Javascript
iview同时验证多个表单问题总结
Sep 29 #Javascript
浅谈关于iview表单验证的问题
Sep 29 #Javascript
Vue路由history模式解决404问题的几种方法
Sep 29 #Javascript
You might like
基于laravel belongsTo使用详解
2019/10/18 PHP
js 操作css实现代码
2009/06/11 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
js实现随机点名小功能
2017/08/17 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
layui table数据修改的回显方法
2019/09/04 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
js实现选项卡效果
2020/03/07 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
室内拓展活动方案
2014/02/13 职场文书
村班子对照检查材料
2014/08/18 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
工作会议通知
2015/04/15 职场文书
道士塔读书笔记
2015/06/30 职场文书
学校财务管理制度
2015/08/04 职场文书
7个你应该知道的JS原生错误类型
2021/04/29 Javascript
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL