vue点击空白区域让窗口关闭

本文介绍如何使用Vue实现点击页面空白处关闭窗口以及窗口互斥的功能。通过设置flag状态和监听document点击事件,结合.stop修饰符阻止事件冒泡,实现了窗口的开闭和互斥。此外,还展示了如何在不干扰其他功能的情况下添加额外的交互,如El-Plus的对话框。代码示例包括HTML模板、TS逻辑和CSS样式。
摘要由CSDN通过智能技术生成

老问题了,自己实现一个,要求有两个:

1.点击窗口其他地方实现页面关闭

2.窗口互斥,一个窗口打开,另一个应该关闭

3.附加要求,其他功能不能被耽误被影响

上html代码

<template>
    <h1>该页面用来测试点击空白关闭窗口</h1>
    <div> <button @click.stop="boxswitch('flag1')">点击激活窗口1</button>
        <div class="box" v-show="flag.flag1" @click.stop>
            <div>窗口一</div>
        </div>
    </div>
    <div> <button @click.stop="boxswitch('flag2')">点击激活窗口2</button>
        <div class="box" v-show="flag.flag2" @click.stop>
            <div>窗口二</div>
        </div>
    </div>
    <el-button :plain="true" @click="open">Show message</el-button>

</template>

两个窗口,加上一个el-plus的对话框,测试要求三,估计懂的同学看到.stop修饰符就知道写法了

上ts,具体注释写在里面了,难点在于一个状态联调

<script lang="ts" setup>
import { ElMessage } from 'element-plus'
import { onMounted, reactive } from "vue"

type FlagType = {
    [key: string]: boolean
}
// 创建一个flag对象,所有关于盒子开关的flag值全部放在里面
let flag = reactive<FlagType>({ flag1: false, flag2: false })
// 一个box全部关闭的方程,该方程会在添加在document的点击时间上,点击页面的任何一点,所有的盒子都会关闭
// 我给了一个可选参数,用来跳过某个flag的某个key,使得这个盒子的状态不变
let boxClose = (key?: string) => {
    for (let k in flag) {
        if (k == key) continue
        flag[k] = false
    }
}
const open = () => {
    ElMessage('this is a message.')
}
//添加了一个参数key让某个盒子打开,同时利用这个参数能够不用写那么多的打开关闭方程
let boxswitch = (key: string) => {
    // 假设A打开(true)又按动btn按钮想让A关闭(false)
    // 假设boxClose没有参数,所有的flag变成false,然后flag[key] = !flag[key],也就是现在对应key的box现在还是true状态
    // 所以要设置参数key,在boxClose阶段跳过,然后flag[key] = !flag[key],此时对应key的flag就是false
    boxClose(key)
    flag[key] = !flag[key]
}
onMounted(() => {
    // 点击document,所有的盒子都会关闭,但是因为我们的button和所要打开的box都加上了@click.stop,使得事件不会向上冒泡,不会触发
    document.addEventListener("click", () => {
        boxClose()
    })
})
</script>

上style,这个就没什么看头了,简单样式

<style lang="scss" scoped>
.box {
    margin: 0 auto;
    height: 40vh;
    width: 40vw;
    border: 1px solid black;
}
</style>

还是觉得自己语言表达的能力欠缺,同时发现以前学过的东西无论多么细小都用得上。不会做gif图,自己测试过,应该好使。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值