Vue3 之dialog弹框简单制作

一、效果图

二、代码

mydialog.vue

复制代码
<template>
    <div class="vux-x-dialog">
        <transition :name="maskTransition">
            <div class="weui-mask" @click.self="hide" v-show="show" :style="maskStyle">
                <transition :name="dialogTransition">
                    <div :class="dialogClass" v-show="show" :style="dialogStyle">
                        <slot></slot>
                    </div>
                </transition>
            </div>
        </transition>
    </div>
</template>

<script>
    export default {
        name: 'x-dialog',
        model: {
            prop: 'show',
            event: 'change'
        },
        props: {
            show: {
                type: Boolean,
                default: false
            },
            maskTransition: {
                type: String,
                default: 'vux-mask'
            },
            maskZIndex: [String, Number],
            dialogTransition: {
                type: String,
                default: 'vux-dialog'
            },
            dialogClass: {
                type: String,
                default: 'weui-dialog'
            },
            hideOnBlur: Boolean,
            dialogStyle: Object
        },
        computed: {
            maskStyle() {
                if (typeof this.maskZIndex !== 'undefined') {
                    return {
                        zIndex: this.maskZIndex
                    }
                }
            }
        },
        mounted() {

        },
        watch: {
            show(val) {
                this.$emit('update:show', val)
                this.$emit(val ? 'on-show' : 'on-hide')
            }
        },
        methods: {
            hide() {
                if (this.hideOnBlur) {
                    this.$emit('update:show', false)
                }
            }
        },
        data() {
            return {

            }
        }
    }
</script>

<style scoped>
    .weui-dialog {
        position: fixed;
        display: table;
        z-index: 5000;
        width: 80%;
        max-width: 300px;
        margin: auto;
        background-color: #fff;
        text-align: center;
        border-radius: 3px;
        overflow: hidden;
    }

    .weui-mask .weui-dialog {
        position: relative;
    }

    .weui-mask {
        position: fixed;
        display: flex;
        justify-content: center;
        align-items: center;
        z-index: 1000;
        top: 0;
        right: 0;
        left: 0;
        bottom: 0;
        background: rgba(0, 0, 0, .6);
    }

    .vux-x-dialog .weui-mask {
        background: rgba(0, 0, 0, .5);
        position: fixed;
        z-index: 1000;
    }

    .weui-mask_transparent {
        position: fixed;
        z-index: 1000;
        top: 0;
        right: 0;
        left: 0;
        bottom: 0;
    }

    .vux-fade-enter-active,
    .vux-fade-leave-active {
        opacity: 1;
        transition: opacity linear 0.2s;
    }

    .vux-fade-enter,
    .vux-fade-leave-to {
        opacity: 0;
    }

    .vux-dialog-enter-active {
        animation: vux-dialog-in .5s;
    }

    .vux-dialog-leave-active {
        animation: vux-dialog-out .3s;
    }

    @keyframes vux-dialog-in {
        0% {
            transform: scale(1.185);
            opacity: 0;
        }

        100% {
            transform: scale(1);
            opacity: 1;
        }
    }

    @keyframes vux-dialog-out {
        0% {
            transform: scale(1);
            opacity: 1;
        }

        100% {
            transform: scale(0.85);
            opacity: 0;
        }
    }

    .vux-mask-enter,
    .vux-mask-leave-active {
        opacity: 0;
    }

    .vux-mask-leave-active,
    .vux-mask-enter-active {
        transition: opacity 300ms;
    }
</style>

三、使用

复制代码
import XDialog from '@/components/MyDialog.vue';

const isshow = ref(false)
const handleShowUpdate = (val) => {
    isshow.value = val
}
const dShow = () => {
    alert('show')
}
const dHide = () => {
    alert('hide')
}

<x-dialog :show="isshow" :dialogStyle="{width: '27rem', maxWidth: '27rem', borderRadius: '8px'}" :hideOnBlur="true" @update:show="handleShowUpdate" @on-show="dShow" @on-hide="dHide">
    123
</x-dialog>
相关推荐
智码看视界14 小时前
老梁聊全栈系列:(阶段一)架构思维与全局观
java·javascript·架构
小周同学@16 小时前
谈谈对this的理解
开发语言·前端·javascript
Wiktok16 小时前
Pyside6加载本地html文件并实现与Javascript进行通信
前端·javascript·html·pyside6
一只小风华~16 小时前
Vue:条件渲染 (Conditional Rendering)
前端·javascript·vue.js·typescript·前端框架
柯南二号16 小时前
【大前端】前端生成二维码
前端·二维码
程序员码歌16 小时前
明年35岁了,如何破局?说说心里话
android·前端·后端
博客zhu虎康17 小时前
React Hooks 报错?一招解决useState问题
前端·javascript·react.js
灰海17 小时前
vue中通过heatmap.js实现热力图(多个热力点)热区展示(带鼠标移入弹窗)
前端·javascript·vue.js·heatmap·heatmapjs
王源骏18 小时前
LayaAir鼠标(手指)控制相机旋转,限制角度
前端
大虾写代码18 小时前
vue3+TS项目配置Eslint+prettier+husky语法校验
前端·vue·eslint