vue里实现点击显示模态框点击自身以外隐藏模态框

本文详细介绍了如何使用自定义变量和事件监听实现一个模态框的显示与隐藏功能。通过给模态框添加类名,并利用Vue.js的数据绑定特性,实现了点击按钮显示模态框,点击模态框外部隐藏模态框的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前阵子做到一个需求是要点击某个按钮弹出个模态框,然后点击模态框的时候模态框还在,点击模态框外部任意区域隐藏模态框,我网上找了下关于这方面的博客很少(也可能是我找的方式不对,哈哈)
首先自己先做好一个模态框的结构,然后给这个结构赋予类名,用一个自定义变量控制这个模态框显示与隐藏

	<div v-if='showBox'>
		<div class='show-parent'>
			<div class="shard">
	          <div class="show-inner">
	            <div>申请次数</div>
	            <div>1天内</div>
	            <div>7天内</div>
	          </div>
	        </div>
		</div>
	</div>

	<span class='show' @click='show'></span>
	export default {
		data() {
			return {
				showBox: false
			}
		},
		methods: {
			show() {
				// 点击的时候显示模态框
				this.showBox = true	
			},
			// 在这里在定义个方法用来监听页面的click事件
			hideBox() {
				document.addEventListener('click', (e) => {
						// 如果当前点击的这个对象是这个模态框的话
					if((e.target).closest('.show-parent')) {
					//  那么这个模态框还是显示的
						this.showBox = true
					} else if(!(e.target).closest('.show')) {
					// 如果当前点击的这个对象是这个show按钮以外的对象,那么这个模态框就隐藏
						this.showBox = false
					}
				})
			}	
		},
		mounted() {
			// 页面加载的时候调用监听
			this.hideBox()
		}
	}

以下代碼使用toolbar功能后,再點擊toolbar以外的區域時則跳出使用toolbar的狀態: <template> <div style="border: 1px solid #ccc" class="editor-container"> <div class="container"> <Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" class="toolbar" /> <Editor style="height: 210px;" v-model="valueHtml" :defaultConfig="editorConfig" :mode="mode" @onCreated="handleCreated" class="editor" /> </div> </div> </template> <script> import '@wangeditor/editor/dist/css/style.css' import { onBeforeUnmount, onMounted, ref, watch } from 'vue' import { Editor, Toolbar } from '@wangeditor/editor-for-vue' // 接收來自父組件的 v-model 值 export default { components: { Editor, Toolbar }, props: { modelValue: String }, emits: ['update:modelValue', 'response'], setup(props, { emit }) { const valueHtml = ref(props.modelValue || '<p>hello</p>') const editorRef = ref(null) onMounted(() => { setTimeout(() => { valueHtml.value = '' }, 1500) }) // 監聽 valueHtml 變化,同步給父組件 // 同時發送 response 事件 watch(valueHtml, (newVal) => { if (newVal !== props.modelValue) { emit('update:modelValue', newVal) emit('response', newVal) } }) // 同步父組件的 modelValue 到 valueHtml watch(() => props.modelValue, (newVal) => { if (newVal !== valueHtml.value) { valueHtml.value = newVal } }) onBeforeUnmount(() => { if (editorRef.value) editorRef.value.destroy() }) const handleCreated = (editor) => { editorRef.value = editor } return { valueHtml, editorRef, toolbarConfig: {}, editorConfig: { placeholder: '請輸入內容...' }, mode: 'default', handleCreated } } } </script> <style scoped> .editor-container { position: fixed; top: 56px; bottom: 45px; left: 0; width: 50%; height: 40%; z-index: 999; background-color: #b60000; overflow-y: auto; } .container { display: flex; flex-direction: column; width: 100%; /* 保持原宽度 */ border: 1px solid #ccc; /* 可选:保留容器边框 */ } .toolbar { } .editor { } </style>
最新发布
08-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值