时间:2021-05-26
原始实现
下面是两种常见的模态框的实现方式
方案一:默认 click 都是放在冒泡阶段,只要在内容区域上添加 click 的阻止冒泡即可
<div class="cover" @click="close"> <!-- 阻止冒泡 --> <div class="content" @click.stop>modal content</div></div>方案二:通过代码判断点击触发的 DOM 是否在内容区域内
<div class="cover" @click="handleClick"> <div class="content" ref="content">modal content</div></div>handleClick (e) { let clickOut = true let temp = e.target do { if (temp === this.$refs.content) { clickOut = false break } temp = temp.parentElement } while (temp !== document.documentElement) console.log(clickOut)}指令实现
上面的代码可以解决全屏的模态框点击外部区域关闭。但是还有一种 Pop 的弹出,这种弹出的外部区域不在本组件内,想要实现这种弹出的点击外部区域关闭用上面的方式二也是可以的,只需把 mounted 阶段把 handleClick 事件添加到 body,在 beforeDestroy 上解绑 body 上的点击时间就就可以了。
如果多个组件需要实现这点击外部区域关闭的效果,可以通过 Vue 的指令来进行封装
实现弹窗
<div class="cover"> <div class="content" v-out-click="close">modal content</div></div>实现弹出
<button @click="popIsShow = true">显示气泡</button><div class="pop" v-if="popIsShow" v-out-click="closePop">I'm pop text</div>指令代码的具体内容如下。有一点比较难受的是指令里面没有地方能存放变量,只好把把这些变量放到了 DOM 上了。还有就是在使用的时候要加上v-的前缀,指令的名字不用带上v-
import outClick from './directive/out-click.js'Vue.directive(outClick.name, outClick)const KEY_OUT = '_out_click'const KEY_OUT_EVENT = '_out_click_event'const KEY_IN = '_in_click'const KEY_FLAG = '_in_out_flag'function removeEvent(el, binding, vnode) { el.removeEventListener('click', el[KEY_IN], false) window.removeEventListener('click', el[KEY_OUT], false) delete el[KEY_IN] delete el[KEY_OUT] delete el[KEY_OUT_EVENT] delete el[KEY_FLAG]}function initEvent(el, binding, vnode) { // setTimeout 0: 忽略点击外部的按钮初始化该组件时,触发的origin click setTimeout(() => { el[KEY_OUT] = () => outClick(el) el[KEY_IN] = () => inClick(el) el[KEY_OUT_EVENT] = binding.value el.addEventListener('click', el[KEY_IN], false) window.addEventListener('click', el[KEY_OUT], false) }, 0)}function inClick(el) { // 通过事件捕获的顺序作为标志位 // 最好不要使用阻止冒泡来实现,那样会影响其他的click无法触发 el[KEY_FLAG] = '1'}function outClick(el) { if (!el[KEY_FLAG] && el[KEY_OUT_EVENT]) { el[KEY_OUT_EVENT]() } delete el[KEY_FLAG]}export default { name: 'out-click', update: (el, binding, vnode) => { if (binding.value === binding.oldValue) { return } removeEvent(el, binding, vnode) initEvent(el, binding, vnode) }, bind: initEvent, unbind: removeEvent}以上就是Vue指令实现OutClick的示例的详细内容,更多关于Vue指令实现OutClick的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.Vue指令 Vue提供自定义实现指令的功能,和组件类似,可以是全局指令和局部指令,详细可以参见vue官网自定义指令一节(https://cn.vuejs.
目标使用vue2.0实现自定义弹窗指令,当标签有该指令时,点击标签可以弹出弹窗实现Document点击我弹窗哈哈哈Vue.directive('popup',{
本文介绍了Vue表单控件绑定的实现示例,感觉这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记。基础用法可以用v-model指令在表单控件元素上创建双向
使用Vue编写简单计算器,供大家参考,具体内容如下在Vue中,v-model指令,可以实现表单元素和Model中数据的双向数据绑定,接下来,我们就用这个指令编写
directive定义全局和局部指令以及指令简写1.使用Vue.directive()定义一个全局指令Vue.directive('指令名称',{对象})2.参