如何用VUE写一个多用模态框组件模版

对于新手们来说,如何写一个可以多用的组件,还是有点难度的,组件如何重用,如何传值这些在实际使用中,是多少会存在一些障碍的,所以今天特意写一个最常用的模态框组件提供给大家,希望能帮助到您!


懒癌患者直接复制粘贴即可

Modal.vue组件

<template>
    <!-- 过渡动画 -->
    <transition name="modal-fade">
        <!-- 关闭模态框事件 和 控制模态框是否显示 -->
        <div class="modal-backdrop"  @click="$emit('closeModal')" v-show="show">
            <div class="modal">
                <img class="img" :src="imgadress" alt="">
                <div class="modal-body" id="modalDescription">
                    <li></li>
                    <!-- 状态提示文字的插槽 -->
                    <slot name="status">{{statusText}}</slot>
                    <li></li>
                </div>
                <!-- 模态框内容文字 可有可无 -->
                <div class="modal-content" v-if="contentText">
                    {{contentText}}
                    <span v-if="IDList" v-for="item in IDList" :key="item.id">{{item.payMoney}}
                        <i>{{item.yuan}}</i>
                    </span>
                </div>
                <ul>
                    <!-- 模态框按钮  可选单个确定按钮 和 两个确定、取消按钮 -->
                    <!-- 单个确定按钮 -->
                    <li v-if="alert" :class="buttonBackground" @click.stop="$emit('button')">确定</li>
                    <!-- 确定和取消按钮 -->
                    <li v-else class="confirm">
                        <div>取消</div>
                        <div :class="buttonBackground" @click.stop="$emit('confirm')">{{sure}}</div>
                    </li>
                </ul>
            </div>
        </div>
    </transition>
</template>
<script>
export default {
    name:'modal',
    // 通过 props 传值
    props: {
        imgadress:String,
        title:String,  //标题文字
        show:{      //显示取消
            type:Boolean,
            default:false
        },
        statusText:String,   //状态文字
        contentText:String,   //描述文字
        IDList:Array,   //ID 列表
        payMoney:Number,
        yuan:String,
        buttonBackground:String, //按钮背景色
        alert:String,   //判断一个还是两个按钮
        sure:String, //第二个按钮的提示文字
        
    },
    data(){
        return{
            closemodal:"close",
            // isModalVisible:false,
            // 确定和取消按钮的两种颜色
            red:'redBackground',
            blue:'blueBackground'
        }
    },
    methods:{
        // 关闭模态框事件
        close(){
            this.$emit('close')
        },
    }
}
</script>
<style lang="scss" scoped> 
.modal-backdrop {
    position: fixed; 
    top: 0; 
    right: 0; 
    bottom: 0; 
    left: 0; 
    background-color: rgba(0,0,0,.3); 
    display: flex; 
    justify-content: center; 
    align-items: center;
    z-index: 12;
    .modal { 
        background-color: #fff; 
        box-shadow: 2px 2px 20px 1px; 
        overflow-x:auto; 
        display: flex; 
        flex-direction: column; 
        width: 11.8rem;
        position: relative;
        border-radius: 0.2rem;
        .img{
            width: 3.6rem;
            height: 3.6rem;
            margin: 0.8rem 4.1rem;
        }
        .modal-header{ 
            padding: 0.6rem 4.1rem;
            width: 3.6rem;
            height: 3.6rem;
            box-sizing: border-box; 
            .img{
                width: 100%;
                height: 100%;
            }
            div{
                width: 100%;
                height: 100%;
                background: #000;
            }
        } 
        .modal-body{
            width: 100%;
            height: 0.48rem;
            padding: 0rem 1.6rem;
            margin-bottom: 0.8rem;
            box-sizing: border-box;
            display: flex;
            justify-content: space-between; 
            align-items: center; 
            li{
                width: 2rem;
                height: 0.04rem;
                background: #eeeee5;
            }
        }
        .modal-content{
            width: 100%;
            // height: 0.6rem;
            margin-bottom: 0.8rem;
            text-align: center;
            color: #34304B;
            span{
                color: #32B8B9;
                i{
                    color: #4F4F4F;
                }
            }
        }
        ul{
            li{
                width: 100%;
                height: 1.52rem;
                line-height: 1.52rem;
                text-align: center;
                color: #fff;
                font-size: 0.56rem;
                letter-spacing: 0.4rem;
            }
            .confirm{
                display: flex;
                div:nth-child(1){
                    flex: 1;
                    background: #DEDEDE;
                    color: #BCBBBF;
                }
                div:nth-child(2){
                    flex: 1;
                    color: #fff;
                }
            }
        }
        .blueBackground{
            background: #21A6DF;
        }
        .redBackground{
            background: #FF4046;
        }
    } 
}
/* 动画 */
.modal-fade-enter,.modal-fade-leave-active{
    opacity: 0;
}
.modal-fade-enter-active, .modal-fade-leave-active{
    transition: opacity 0.5s ease;
}
</style>

新建一个index.js文件,在其中全局引入组件,全局引入之后,就不用在每个调用的组件里面单独引入了,可以直接使用

import Modalfrom "./Modal.vue";
const components = {
    install: function (Vue) {
        Vue.component('Modal', Modal);
    }
}
//导出组件
export default components;

Index.vue中调用

<template>
    <div class="index">
<!-- 提交成功模态框 -->
        <Modal
            ref="Modal"
            :imgadress="imgadress"
            v-show="isModalVisible"
            statusText="提交成功"
            @closeModal="closeModal"
            contentText="Index.vue"
            :IDList="IDList"
            :buttonBackground="red"
            sure="确定"
            @confirm="confirm"
        >
            <!-- :payMoney="payMoney"
            yuan="元" -->
        </Modal>
        <button @click="showModel">支付成功模态框</button>

    </div>
</template>
<script>
export default {
    name: 'Index',
    data(){
        return{
            // 模态框
            imgadress:require('./../../assets/img/success.png'),
            isModalVisible:false,
            show: false,
            showToast: false,
            thisIndex:0,
            green:'green',
            blue:'',
            red:'',
            IDList:[
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
                {payMoney:23456,yuan:'、'},
            ],
            payMoney:99,
        }
    },
    methods:{
        // 提示模态框
        showModel(){
            this.isModalVisible = true;
            this.blue = this.$refs.Model.blue
            this.red = this.$refs.Model.red
            
        },
        closeModal(){
            this.isModalVisible = false
        },
        confirm(){
            console.log(11111111111);
        },
    }
}
</script>

效果如图


模态框-1.gif

如果只需要一个确定按钮,只需要在调用的时候,这么写就好了

<template>
    <div class="index">
<!-- 提交成功模态框 -->
        <Modal
            ref="Modal"
            :imgadress="imgadress"
            v-show="isModalVisible"
            statusText="提交成功"
            @closeModal="closeModal"
            contentText="Index.vue"
            :IDList="IDList"
            :buttonBackground="blue"
            @button="closeModal"
            sure="确定"
            alert="1"
        >
        </Modal>
        <button @click="showModel">支付成功模态框</button>

    </div>
</template>

如图


模态框-2.gif

可能并不是特别完美,如果您发现有缺点,还请不吝赐教!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,734评论 25 707
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 2,689评论 1 17
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,699评论 2 59
  • 一、分析思路 1、分析业务模式的组成,有什么优缺点。是否有更好的业务模式,为什么? 2、预计资金需求。可查找相关行...
    铁汁阅读 5,413评论 2 1
  • 用SHE的一首歌致敬行将消失的青春,许多年前的梦想还在,但还要用更大努力和热情来对待即将发生的一切。勇敢面对现实,...
    强强爱做梦阅读 412评论 0 1