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

2023-10-17  本文已影响0人  焚心123
<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>
<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>
上一篇 下一篇

猜你喜欢

热点阅读