用vue封裝一個通用的提示彈框

在vue項目中若是想封裝一個通用的vue組件,能夠用slot+props的方式,也能夠用extend的方式,看具體需求來肯定用那種方式。css

下面用extend封裝一個通用的提示框html

首先先寫template模版 vAlert.vuevue

<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.jsapp

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直接調用了svg

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

使用flex

this.$VAlert.success('保存成功')
相關文章
相關標籤/搜索