vue中下拉菜单,点击其他区域收起

这个常见的问题,我发现现在网上的很多方法,不是极其繁琐就是有问题。

比如下面这个:

<template>
<div class="nian">
    <div class="selectBox" @click.stop="isshow=!isshow">
        <div>选择年份:</div>
        <div>
            <div>2022年</div>
            <img src="../assets/images/down.png" alt="">
        </div>
    </div>
    <div v-show="isshow" class="list" ref="drop">
        <div>2021年</div>
        <div>2022年</div>
    </div>
</div>
</template>
 
<script>
export default {
    name: 'xiala',
    components: {},
    data: () => ({
        isshow:false
    }),
    computed: {},
    watch: {},
    mounted() {
        document.addEventListener('click', this.clickOut)
    },
    methods: {
         // 当点击菜单以外的区域隐藏菜单
         clickOut(e) {
            let drop = this.$refs.drop
            if (drop && !drop.contains(e.target) && this.isshow) {
                this.isshow = false
            }
        },
    },
    created() {},
    destroyed() {},
}
</script>

乍一看逻辑没什么问题,但是我使用的时候发现,当点击展示下拉框,isshow赋值为true的时候,因为出现了点击行为,clickOut也会调用,isshow又被重新赋值为false了,这样下拉框就不会展示了。所以我们还需要获取点击出现下拉框的元素,把他也同时排除在外

像这样:

<template>
<div class="nian">
    <div ref="term" class="selectBox" @click.stop="isshow=!isshow">
        <div>选择年份:</div>
        <div>
            <div>2022年</div>
            <img src="../assets/images/down.png" alt="">
        </div>
    </div>
    <div v-show="isshow" class="list" ref="drop">
        <div>2021年</div>
        <div>2022年</div>
    </div>
</div>
</template>
 
<script>
export default {
    name: 'xiala',
    components: {},
    data: () => ({
        isshow:false
    }),
    computed: {},
    watch: {},
    mounted() {
        document.addEventListener('click', this.clickOut)
    },
    methods: {
         // 当点击菜单以外的区域隐藏菜单
         clickOut(e) {
            let drop = this.$refs.drop
            let term = this.$refs.term
            if (drop && !drop.contains(e.target) && term && !term.contains(e.target) && this.isshow) {
                this.isshow = false
            }
        },
    },
    created() {},
    destroyed() {},
}
</script>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值