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 相关文章推荐
javascript String 对象
Apr 25 Javascript
jQuery ui1.7 dialog只能弹出一次问题
Aug 27 Javascript
通过javascript设置css属性的代码
Dec 28 Javascript
一些javascript一些题目的解析
Dec 25 Javascript
模拟select的代码
Oct 19 Javascript
JavaScript中变量提升 Hoisting
Jul 03 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
JavaScript学习笔记之Function对象
Jan 22 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
JS中对Cookie的操作详解
Aug 05 Javascript
纯js实现倒计时功能
Jan 06 Javascript
jQuery Validate 数组 全部验证问题
Jan 12 Javascript
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
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
2016/08/17 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
2010/08/16 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
Python 常用的安装Module方式汇总
2017/05/06 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
2020/05/16 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
2020/06/06 Python
全球最大的网上自行车商店:Chain Reaction Cycles
2016/12/02 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
广州盈通面试题
2015/12/05 面试题
项目管理计划书
2014/01/09 职场文书
小学语文教学反思
2014/02/10 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
学校中秋节活动总结
2015/03/23 职场文书
2015年高中语文教学总结
2015/08/18 职场文书
Python 实现定积分与二重定积分的操作
2021/05/26 Python