vue⾃定义插件封装,实现简易的elementUi的Message和
MessageBox的⽰例
这次封装基于vuecli3 + typescript实现,javascript也是同理,没有区别;
⾃定义插件有助于我们可以将⼀些页⾯交互封装并在js或ts⽂件中引⼊实现,⽽不是只在 .vue⽂件。
1、实现toast插件封装(类似简易版的elementUi的message)
先书写⼀个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.$astRef;
if (pe === 'success') {
ele.style.backgroundColor = '#f0f9eb';
ele.style.borderColor = '#e1f3d8';
lor = '#67c23a';
} else if (pe === 'error') {
ele.style.backgroundColor = '#fef0f0';
ele.style.borderColor = '#fde2e2';
lor = '#f56c6c';
}
}
showToast() {
let ele: HTMLElement = <HTMLElement>this.$astRef;
p = '20px';
vue element adminele.style.opacity = '1';
}
hideToast() {
let ele: HTMLElement = <HTMLElement>this.$astRef;
p = '-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>
然后书写对应的toast.ts
import Vue from 'vue';
// toast组件
import toastComponent from '@/components/toast/index.vue'
// 返回⼀个扩展实例构造器
const ToastConstructor = d(toastComponent)
// 定义弹出组件的函数接收2个参数, 要显⽰的⽂本和显⽰时间
function showToast(data: { message: any, type: string, duration?: number }) {
// 实例化⼀个 toast.vue
const toastDom: any = new ToastConstructor({
el: ateElement('div'),
data() {
return {
message: ssage,
type: pe,
}
}
});
/
/ 把实例化的 toast.vue 添加到 body ⾥
document.body.appendChild(toastDom.$el);
setTimeout(() => { toastDom.showToast(); })
// 过了 duration 时间后隐藏
let duration = data.duration ? data.duration : 2000
setTimeout(() => {
toastDom.hideToast();
setTimeout(() => {
veChild(toastDom.$el)
}, 500)
}, duration)
}
// 注册为全局组件的函数
function registryToast() {
// 将组件注册到 vue 的原型链⾥去,
// 这样就可以在所有 vue 的实例⾥⾯使⽤ this.$toast()
Vue.prototype.$toast = showToast
}
export default registryToast;
然后在main.ts中注册
// ⾃定义toast插件
import toastMessage from '@/utils/toast.ts';
Vue.use(toastMessage)
然后就可以在全局地⽅使⽤
this.$toast({message:"成功",type:'success'})
效果如下:
2、实现$confirm插件封装(类似简易版的elementUi的messageBox)
主要⽤于操作的⼆次确定
还是⼀样,⾸先书写confirm组件
这⾥按钮点击事件我设置了⼀个callback回调,⽤于⽅便后⾯的操作交互
<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.$firmBox;
if (ains(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>
对应的书写confirm.ts
这⾥使⽤Promise来为⽤户点击确定或者取消做对应的交互触发
import Vue from 'vue';
import confirm from '@/components/confirm/index.vue';
const confirmConstructor = d(confirm);
const showConfirm = (contentText: string) => {
return new Promise((reslove, reject) => {
const confirmDom: any = new confirmConstructor({
el: ateElement('template'),
data() {
return {
contentText,
}
},
})
confirmDom.callback = (action: string) => {
if (action === 'confirm') {
reslove()
} else if (action === 'cancel') {
reject()
}
}
document.body.appendChild(confirmDom.$el);
})
}
function registryConfirm() {
// 将组件注册到 vue 的原型链⾥去,
// 这样就可以在所有 vue 的实例⾥⾯使⽤ this.$toast()
Vue.prototype.$confirm = showConfirm
}
export default registryConfirm;
接下来在main.ts中
import registryConfirm from '@/utils/confirm.ts';
Vue.use(registryConfirm)
然后就可以在全局使⽤
this.$confirm('是否确认删除')
.then(() => {
this.$toast({
message: '删除成功',
type: 'success',
});
})
.catch(() => {});
效果如下
这时,点击确定按钮就会触发 .then⾥的事件,点击取消则触发 .catch⾥的事件
typescript对应的声明⽂件
typescript书写⾃定义插件对应的声明⽂件,避免编辑报错
import Vue from "vue";
declare module "vue/types/vue" {
interface Vue {
$toast: any,
$confirm: any
}
}
以上就是vue⾃定义插件封装,实现简易的elementUi的Message和MessageBox的⽰例的详细内容,更多关于vue⾃定义插件封装的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论