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 相关文章推荐
Display SQL Server Version Information
Jun 21 Javascript
页面中iframe相互传值传参
Dec 13 Javascript
JavaScript中变量提升 Hoisting
Jul 03 Javascript
JavaScript获取XML数据附示例截图
Mar 05 Javascript
BOM系列第一篇之定时器setTimeout和setInterval
Aug 17 Javascript
BootStrap入门学习第一篇
Aug 28 Javascript
JavaScript实现简单的文本逐字打印效果示例
Apr 12 Javascript
深入浅析var,let,const的异同点
Aug 07 Javascript
element-ui 中使用upload多文件上传只请求一次接口
Jul 19 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
Nov 25 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
May 07 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中显示格式化的用户输入
2006/10/09 PHP
php 运行效率总结(提示程序速度)
2009/11/26 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
JS的replace方法介绍
2012/10/20 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
Javascript 函数parseInt()转换时出现bug问题
2014/05/20 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
vue.js数据绑定操作详解
2018/04/23 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
js实现点击烟花特效
2020/10/14 Javascript
Vue项目中使用mock.js的完整步骤
2021/01/12 Vue.js
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python 文件操作api(文件操作函数)
2016/08/28 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
适合各种场合的美食礼品:Harry & David
2016/08/03 全球购物
幼儿园中班上学期评语
2014/04/18 职场文书
2014年母亲节寄语
2014/05/07 职场文书
优秀员工演讲稿
2014/05/19 职场文书
机电一体化毕业生自荐信
2014/06/19 职场文书
会员活动策划方案
2014/08/19 职场文书
运动会演讲稿50字
2014/08/25 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
2022微信温控新功能上线
2022/05/09 数码科技