vue自定義插件封裝,實(shí)現(xiàn)簡(jiǎn)易的elementUi的Message和MessageBox的示例
這次封裝基于vuecli3 + typescript實(shí)現(xiàn),javascript也是同理,沒有區(qū)別;
自定義插件有助于我們可以將一些頁(yè)面交互封裝并在js或ts文件中引入實(shí)現(xiàn),而不是只在 .vue文件。
1、實(shí)現(xiàn)toast插件封裝(類似簡(jiǎn)易版的elementUi的message)
先書寫一個(gè)toast組件
<template>
<div ref="toastRef" class="toastMessageBox">{{ message }}</div>
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
@Component({})
export default class toast extends Vue {
message: string = '';
type: string = '';
mounted() {
let ele: HTMLElement = <HTMLElement>this.$refs.toastRef;
if (this.type === 'success') {
ele.style.backgroundColor = '#f0f9eb';
ele.style.borderColor = '#e1f3d8';
ele.style.color = '#67c23a';
} else if (this.type === 'error') {
ele.style.backgroundColor = '#fef0f0';
ele.style.borderColor = '#fde2e2';
ele.style.color = '#f56c6c';
}
}
showToast() {
let ele: HTMLElement = <HTMLElement>this.$refs.toastRef;
ele.style.top = '20px';
ele.style.opacity = '1';
}
hideToast() {
let ele: HTMLElement = <HTMLElement>this.$refs.toastRef;
ele.style.top = '-100px';
ele.style.opacity = '0';
}
}
</script>
<style scoped lang="scss">
.toastMessageBox {
position: fixed;
min-width: 380px;
left: 50%;
z-index: 999;
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
color: #fff;
padding: 15px 15px 15px 20px;
font-size: 16px;
border-radius: 4px;
opacity: 0;
top: -100px;
transition: opacity 0.3s, top 0.4s;
color: #909399;
background-color: #edf2fc;
border: 1px solid #ebeef5;
}
</style>
然后書寫對(duì)應(yīng)的toast.ts
import Vue from 'vue';
// toast組件
import toastComponent from '@/components/toast/index.vue'
// 返回一個(gè) 擴(kuò)展實(shí)例構(gòu)造器
const ToastConstructor = Vue.extend(toastComponent)
// 定義彈出組件的函數(shù) 接收2個(gè)參數(shù), 要顯示的文本 和 顯示時(shí)間
function showToast(data: { message: any, type: string, duration?: number }) {
// 實(shí)例化一個(gè) toast.vue
const toastDom: any = new ToastConstructor({
el: document.createElement('div'),
data() {
return {
message: data.message,
type: data.type,
}
}
});
// 把 實(shí)例化的 toast.vue 添加到 body 里
document.body.appendChild(toastDom.$el);
setTimeout(() => { toastDom.showToast(); })
// 過了 duration 時(shí)間后隱藏
let duration = data.duration ? data.duration : 2000
setTimeout(() => {
toastDom.hideToast();
setTimeout(() => {
document.body.removeChild(toastDom.$el)
}, 500)
}, duration)
}
// 注冊(cè)為全局組件的函數(shù)
function registryToast() {
// 將組件注冊(cè)到 vue 的 原型鏈里去,
// 這樣就可以在所有 vue 的實(shí)例里面使用 this.$toast()
Vue.prototype.$toast = showToast
}
export default registryToast;
然后在main.ts中注冊(cè)
// 自定義toast插件 import toastMessage from '@/utils/toast.ts'; Vue.use(toastMessage)
然后就可以在全局地方使用
this.$toast({message:"成功",type:'success'})
效果如下:

2、實(shí)現(xiàn)$confirm插件封裝(類似簡(jiǎn)易版的elementUi的messageBox)
主要用于操作的二次確定
還是一樣,首先書寫confirm組件
這里按鈕點(diǎn)擊事件我設(shè)置了一個(gè)callback回調(diào),用于方便后面的操作交互
<template>
<div class="confirm-wrapper" @click="confirmClick($event)">
<div class="confirm-box" ref="confirmBox">
<p class="confirm-title">
{{ title }}
</p>
<p class="content-text">
{{ contentText }}
</p>
<div class="footer-button">
<ck-button size="mini" @click="close">取消</ck-button>
<ck-button size="mini" class="define-button" type="primary" @click="define">確定</ck-button>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Vue, Watch } from 'vue-property-decorator';
@Component({})
export default class confirm extends Vue {
title: string = '提示';
contentText: string = '';
callback: any = null;
confirmClick(e: any) {
let confirmBox = this.$refs.confirmBox;
if (e.target.contains(confirmBox)) {
(<HTMLElement>this.$el.parentNode).removeChild(this.$el);
}
}
define() {
(<HTMLElement>this.$el.parentNode).removeChild(this.$el);
this.callback('confirm');
}
close() {
(<HTMLElement>this.$el.parentNode).removeChild(this.$el);
this.callback('cancel');
}
}
</script>
<style scoped lang="scss">
.confirm-wrapper {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
.confirm-box {
width: 420px;
padding-bottom: 10px;
vertical-align: middle;
background-color: #fff;
border-radius: 4px;
border: 1px solid #ebeef5;
font-size: 18px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
text-align: left;
overflow: hidden;
backface-visibility: hidden;
.confirm-title {
padding: 15px 15px 10px;
font-size: 18px;
}
.content-text {
padding: 10px 15px;
color: #606266;
font-size: 14px;
}
.footer-button {
padding-top: 24px;
display: flex;
justify-content: flex-end;
padding-right: 24px;
.define-button {
margin-left: 16px;
}
}
}
}
</style>
對(duì)應(yīng)的書寫confirm.ts
這里使用Promise來為用戶點(diǎn)擊確定或者取消做對(duì)應(yīng)的交互觸發(fā)
import Vue from 'vue';
import confirm from '@/components/confirm/index.vue';
const confirmConstructor = Vue.extend(confirm);
const showConfirm = (contentText: string) => {
return new Promise((reslove, reject) => {
const confirmDom: any = new confirmConstructor({
el: document.createElement('template'),
data() {
return {
contentText,
}
},
})
confirmDom.callback = (action: string) => {
if (action === 'confirm') {
reslove()
} else if (action === 'cancel') {
reject()
}
}
document.body.appendChild(confirmDom.$el);
})
}
function registryConfirm() {
// 將組件注冊(cè)到 vue 的 原型鏈里去,
// 這樣就可以在所有 vue 的實(shí)例里面使用 this.$toast()
Vue.prototype.$confirm = showConfirm
}
export default registryConfirm;
接下來在main.ts中
import registryConfirm from '@/utils/confirm.ts'; Vue.use(registryConfirm)
然后就可以在全局使用
this.$confirm('是否確認(rèn)刪除')
.then(() => {
this.$toast({
message: '刪除成功',
type: 'success',
});
})
.catch(() => {});
效果如下

這時(shí),點(diǎn)擊確定按鈕就會(huì)觸發(fā) .then里的事件,點(diǎn)擊取消則觸發(fā) .catch里的事件
typescript對(duì)應(yīng)的聲明文件
typescript書寫自定義插件對(duì)應(yīng)的聲明文件,避免編輯報(bào)錯(cuò)
import Vue from "vue";
declare module "vue/types/vue" {
interface Vue {
$toast: any,
$confirm: any
}
}
以上就是vue自定義插件封裝,實(shí)現(xiàn)簡(jiǎn)易的elementUi的Message和MessageBox的示例的詳細(xì)內(nèi)容,更多關(guān)于vue自定義插件封裝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue實(shí)現(xiàn)的雙向數(shù)據(jù)綁定操作示例
這篇文章主要介紹了vue實(shí)現(xiàn)的雙向數(shù)據(jù)綁定操作,結(jié)合完整實(shí)例形式較為詳細(xì)的分析了vue.js進(jìn)行數(shù)據(jù)雙向綁定操作的常見實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
使用Vue實(shí)現(xiàn)Markdown文檔的展示和解析
在Vue項(xiàng)目中,Markdown文檔的使用越來越普遍,因此在Vue中如何進(jìn)行Markdown文檔展示與解析也成為了一個(gè)熱門話題,本文將介紹如何使用Vue實(shí)現(xiàn)Markdown文檔的展示和解析,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-01-01
深度了解vue.js中hooks的相關(guān)知識(shí)
這篇文章主要介紹了深度了解vue.js中hooks的相關(guān)知識(shí),生命周期鉤子提供了一些 方法 ,因此你可以在組件生命周期的不同時(shí)刻精確地觸發(fā)某些操作。當(dāng)我們將組件實(shí)例化時(shí),組件會(huì)被創(chuàng)建,反之會(huì)被銷毀。,需要的朋友可以參考下2019-06-06
基于vue2的table分頁(yè)組件實(shí)現(xiàn)方法
這篇文章主要為大家詳細(xì)介紹了基于vue2的table分頁(yè)組件實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03

