用vue封装一个通用的提示弹框

在vue项目中如果想封装一个通用的vue组件,可以用slot+props的方式,也可以用extend的方式,看具体需求来确定用那种方式。

下面用extend封装一个通用的提示框

首先先写template模版 vAlert.vue

<template>
    <div class="v-alert" v-if="show">
        <b :class="type"></b>
        <p :class="type" v-html="text"></p>
    </div>
</template>
<script>
export default {
  props: ['show', 'text', 'type']
}
</script>
<style lang="scss" scoped>
    .v-alert{
        width:100%;
        height:pr(80);
        padding:pr(20);
        position: fixed;
        top:pr(-80);
        left:0;
        z-index: 1999;
        display: flex;
        align-items: center;
        background: #fff;
        animation: show 3s;
        b{
            width:pr(36);
            height:pr(36);
            margin-right: pr(12);
            &.warning{
            background: url('~@/img/product/orderResult/failed.svg') no-repeat;
            background-size: 100%;
            }
            &.success{
            background: url('~@/img/product/orderResult/success.svg') no-repeat;
            background-size: 100%;
            }
        }
        p{
            font-size: pr(28);
            &.success{
                color:#42b983;
            }
            &.warning{
                color: #e96900;
            }
        }
        @keyframes show {
            0% {
                top:pr(-80);
            }
            20% {
                top:pr(0);
            }
            80% {
                top:pr(0);
            }
            100% {
                top:pr(-80);
            }
        }
    }
</style>

然后是js文件 index.js

import Vue from 'vue'
import vAlert from './vAlert.vue'

// 获取组件构造器
const VAlert = Vue.extend(vAlert)

function AModal() {
  let VM = null
  return function(type, text) {
    if (!text) return
    if (!VM) {
      const oDiv = document.createElement('div')
      // 创建VAlert实例
      VM = new VAlert({el: oDiv})
      // 并把实例化的模板插入body
      document.body.appendChild(VM.$el)
    }
    // 设置属性
    VM.type = type
    VM.text = text
    VM.show = true
    setTimeout(() => {
      VM.show = false
    }, 3000)
  }
}

let SHOW = AModal()

export default {
  warning: (v) => {
    SHOW('warning', v)
  },
  success: (v) => {
    SHOW('success', v)
  }
}

在引入使用时,可以直接挂载到prototype上,这样就可以this直接调用了

import VAlert from "@/components/common/vAlert"
Vue.$VAlert = Vue.prototype.$VAlert = VAlert

使用

this.$VAlert.success('保存成功')

 

posted @ 2019-05-29 16:04  如斯~  阅读(2038)  评论(1编辑  收藏  举报