美文网首页
vue3中的弹框,点击外部区域隐藏

vue3中的弹框,点击外部区域隐藏

作者: 焚心123 | 来源:发表于2023-10-17 11:22 被阅读0次
  • 效果图(点击右侧的按钮,展示弹框,点击外部区域,当前的弹框进行隐藏)


    image.png
  • 首先要将按钮和弹框写在一个组件中,用一个标签将两个进行包裹,否则后面点击的话,会有问题

  • 话不多说,直接上代码

<div class="dialog-po" ref="dialog">
        <img src="../assets/image/icon.png" alt="" class="icon" @click="() => (show = !show)" />
        <div class="dialog" v-if="show">
            <ul>
                <li v-for="(item, index) in actions" :key="index" class="flexr flexcc po-li" @click="onSelect(index)" ref="dialogChild">
                    <img src="../assets/image/ac.png" alt="" class="ac" v-show="item.check" />
                    <p :class="item.check ? 'ac-li' : ''">{{ item.text }}</p>
                </li>
            </ul>
        </div>
    </div>
  • 上述代码中,第一张图片是菜单,图片中的右上角的小按钮,主要是ref在当前页面的根标签上
<script>
import { watch } from 'vue';
export default {
    name: 'DialogPage',
    components: {},
    props: {},
    emits: ['dialogTitlte'],
    setup(props, { emit }) {
        const data = reactive({
            show: false,
            actions: [
                { text: '首页', check: true, path: '/' },
                { text: '我们的产品', check: false, path: '/product' },
                { text: '订制化解决方案', check: false, path: '/option' },
                { text: '果儿商城', check: false, path: '/shop' },
                { text: '新闻资讯', check: false, path: '/message' },
                { text: '关于我们', check: false, path: '/about' },
            ],
        });
        const route = useRoute();
        const router = useRouter();
        // 不是点击弹框中的事件,直接跳转展示的问题进行优化
        watch(
            () => route.path,
            (newVal) => {
                data.actions.forEach((item) => {
                    if (item.path === newVal) {
                        item.check = true;
                    } else {
                        item.check = false;
                    }
                });
            }
        );
        // 弹框中的点击事件,进行回调父组件通知更新
        const onSelect = (k) => {
            data.actions.forEach((item) => (item.check = false));
            data.actions[k].check = true;
            emit('dialogTitlte', data.actions[k].text);
            data.show = false;
            if (k == 3) {
                window.open('https://miniapp.coretecnology.com/h5/guoer/index.html#/', '_blank');
            } else {
                router.push(data.actions[k].path);
            }
        };

        const dialog = ref(null);
        onMounted(() => {
            document.addEventListener('click', (e) => hideDialog(e));
        });
        // 监听弹框标签外的点击事件,弹框外的点击事件可隐藏当前的弹框
        const hideDialog = (e) => {
            console.log('e', e, dialog.value?.contains(e.target), data.show);
            if (data.show && !dialog.value?.contains(e.target)) {
                data.show = false;
            }
        };
        onUnmounted(() => {
            document.removeEventListener('click', (e) => hideDialog(e));
        });
        return {
            ...toRefs(data),
            dialog,
            onSelect,
        };
    },
};
</script>
  • vue 的api是用的插件自动引入可查看我的另一篇文章,代码的逻辑主要在最下面,onMounted这里,判断当前点击的元素在不在,不在就进行隐藏
  • 有不懂的小伙伴可以私信我,希望可以帮助到你!

相关文章

  • demo1 动态显示view或弹框 动态隐藏view或弹框

    有一个弹框,弹框上边有一个关闭按钮,点击按钮,可以关闭弹框。点击弹框的周围区域也可以关闭按钮。 点击上边的隐藏弹框...

  • vue中禁止遮罩底层页面滑动

    方法一:在点击事件(弹出弹框)时,添加 在隐藏弹框时 方法二:在点击事件(弹出弹框)时,添加 在隐藏弹框方法中,添加

  • 遮罩层实现

    代码如下 实现效果:点击按钮,显示遮罩层,弹出弹框点击遮罩层,隐藏遮罩层,隐藏弹框

  • 点击弹框以外的区域,隐藏弹框jquery实现

    点击按钮显示某个弹框,然后点击此弹框以外的区域让你隐藏,网上找到了比较好的实现方法,这里做一下总结 原理就是通过j...

  • 进阶任务10-事件应用

    实现Tab切换的功能 实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

  • antd form component

    两个属性 destroyOnClose关闭弹框后,清空之前写的内容 maskClosable 点击弹框外部的阴影,...

  • elementUI中渲染多个popover弹框组件popover

    解决在做elementUI项目引用多个弹框popover时,点击弹框内按钮,弹框不隐藏的问题;解决思路:在组件外写...

  • 事件的应用

    1. 实现如下图Tab切换的功能 2. 实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

  • 进阶任务10

    1.实现如下图Tab切换的功能 2.实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

  • 事件的应用

    1.实现如下图Tab切换的功能: 2.实现下图的模态框功能,点击模态框不隐藏,点击关闭以及模态框以外的区域模态框隐藏

网友评论

      本文标题:vue3中的弹框,点击外部区域隐藏

      本文链接:https://www.haomeiwen.com/subject/ssofidtx.html