在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('保存成功')