日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue自定義插件封裝,實現(xiàn)簡易的elementUi的Message和MessageBox的示例

瀏覽:185日期:2022-10-24 14:08:06

這次封裝基于vuecli3 + typescript實現(xiàn),javascript也是同理,沒有區(qū)別;

自定義插件有助于我們可以將一些頁面交互封裝并在js或ts文件中引入實現(xiàn),而不是只在 .vue文件。

1、實現(xiàn)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.$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>

然后書寫對應(yīng)的toast.ts

import Vue from ’vue’;// toast組件import toastComponent from ’@/components/toast/index.vue’// 返回一個 擴(kuò)展實例構(gòu)造器const ToastConstructor = Vue.extend(toastComponent)// 定義彈出組件的函數(shù) 接收2個參數(shù), 要顯示的文本 和 顯示時間function showToast(data: { message: any, type: string, duration?: number }) { // 實例化一個 toast.vue const toastDom: any = new ToastConstructor({ el: document.createElement(’div’), data() { return {message: data.message,type: data.type, } } }); // 把 實例化的 toast.vue 添加到 body 里 document.body.appendChild(toastDom.$el); setTimeout(() => { toastDom.showToast(); }) // 過了 duration 時間后隱藏 let duration = data.duration ? data.duration : 2000 setTimeout(() => { toastDom.hideToast(); setTimeout(() => { document.body.removeChild(toastDom.$el) }, 500) }, duration)}// 注冊為全局組件的函數(shù)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’})

效果如下:

vue自定義插件封裝,實現(xiàn)簡易的elementUi的Message和MessageBox的示例

2、實現(xiàn)$confirm插件封裝(類似簡易版的elementUi的messageBox)

主要用于操作的二次確定

還是一樣,首先書寫confirm組件

這里按鈕點擊事件我設(shè)置了一個callback回調(diào),用于方便后面的操作交互

<template> <div @click='confirmClick($event)'> <div 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' 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>

對應(yīng)的書寫confirm.ts

這里使用Promise來為用戶點擊確定或者取消做對應(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() { // 將組件注冊到 vue 的 原型鏈里去, // 這樣就可以在所有 vue 的實例里面使用 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(() => {});

效果如下

vue自定義插件封裝,實現(xiàn)簡易的elementUi的Message和MessageBox的示例

這時,點擊確定按鈕就會觸發(fā) .then里的事件,點擊取消則觸發(fā) .catch里的事件

typescript對應(yīng)的聲明文件

typescript書寫自定義插件對應(yīng)的聲明文件,避免編輯報錯

import Vue from 'vue';declare module 'vue/types/vue' { interface Vue { $toast: any, $confirm: any }}

以上就是vue自定義插件封裝,實現(xiàn)簡易的elementUi的Message和MessageBox的示例的詳細(xì)內(nèi)容,更多關(guān)于vue自定義插件封裝的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩高清不卡一区| 国产精品久久久久久久久久久久久久久 | 麻豆久久久久久| 欧美1区2区3| 日韩手机在线| 里番精品3d一二三区| 亚洲性图久久| 亚洲五月婷婷| 成人啊v在线| 蜜桃久久久久| 天堂网av成人| 免费久久精品视频| 青青草91视频| 精品国产亚洲一区二区三区| 日韩免费福利视频| 美女日韩在线中文字幕| 日韩激情网站| 国产欧美丝祙| 精品国产网站| 亚洲国产影院| 国产一卡不卡| 日韩在线欧美| 成人国产综合| 伊人成人网在线看| 欧美亚洲自偷自偷| 久久久久网站| 日本成人中文字幕| 色黄视频在线观看| 亚洲精品观看| 伊人久久高清| 日本久久一区| 久久激情中文| 国产伦精品一区二区三区在线播放| 日韩免费福利视频| 日韩精品欧美精品| 国产不卡精品在线| 99久久www免费| 国产a久久精品一区二区三区| 成人免费一区| 免费久久精品视频| 久久99久久久精品欧美| 精品亚洲成人| 99视频在线精品国自产拍免费观看| 日韩激情精品| 日韩一区亚洲二区| 国产精品毛片一区二区三区| 国产精品啊啊啊| 久久亚洲成人| 亚洲三区欧美一区国产二区| 国产精品99视频| 蜜臀av一区二区在线免费观看| 久久不见久久见国语| 午夜精品婷婷| 久久尤物视频| 国产女优一区| 国产乱码午夜在线视频| 久久高清免费观看| 免费观看亚洲| 国产精品夜夜夜| 亚洲欧美视频| 神马久久午夜| 日韩av电影一区| 日韩视频网站在线观看| 日韩综合小视频| 久久中文亚洲字幕| 亚洲一二av| 麻豆mv在线观看| 亚洲免费毛片| 国产九九精品| 国精品产品一区| 日韩一区中文| 中文字幕日韩欧美精品高清在线| 日本午夜精品一区二区三区电影| 国产精品va视频| 91亚洲国产成人久久精品| 丝袜美腿亚洲色图| 婷婷综合网站| av免费不卡国产观看| 极品日韩av| 日本成人在线不卡视频| 91精品精品| 国产一区二区三区不卡视频网站 | 好吊日精品视频 | 久久青青视频| 久久不卡日韩美女| 日韩精品导航| 亚洲伊人精品酒店| 亚洲一区激情| 激情久久五月| 黑森林国产精品av| 久久精品系列| 国产美女亚洲精品7777| 伊人久久在线| 日本一二区不卡| 精品一区二区三区亚洲| 国产乱码精品一区二区亚洲| 欧美亚洲国产精品久久| 日韩欧美字幕| 亚洲国产福利| 亚洲v天堂v手机在线| 蜜乳av另类精品一区二区| 亚洲欧美日韩高清在线| 精品久久一区| 免费日韩成人| 麻豆视频久久| 麻豆国产91在线播放| 美腿丝袜亚洲三区| 久久只有精品| 精品一区二区三区亚洲| 精品一区电影| 国产在线看片免费视频在线观看| 精品国产一区二区三区噜噜噜| 麻豆极品一区二区三区| 精品国产亚洲日本| 高清精品久久| 久久精品中文| 亚洲经典在线| 丝袜美腿亚洲一区| 一区二区三区网站| 午夜天堂精品久久久久| 中文字幕一区日韩精品| 亚州av一区| 日韩av中文字幕一区二区三区| 亚洲精品影院在线观看| 日韩综合一区二区| 国产欧美日韩一区二区三区在线| 国产亚洲精品美女久久| 国产精品18| 美女视频免费精品| 国产a亚洲精品| 麻豆精品蜜桃| 欧美日韩激情| 亚洲免费高清| 亚洲1区在线观看| 国产欧美一区二区精品久久久| 开心激情综合| 日本а中文在线天堂| 亚洲二区在线| 中文亚洲免费| 天堂久久一区| 国产精品4hu.www| 黄色aa久久| 欧美丝袜一区| 日韩视频久久| 亚洲精品无播放器在线播放| 欧美一区激情| 国产亚洲电影| 91免费精品| 午夜电影亚洲| 国产精品一区二区三区av| 粉嫩av一区二区三区四区五区 | 麻豆一区二区在线| 色在线视频观看| 午夜亚洲一区| 国产精品成人**免费视频| 久久精品亚洲欧美日韩精品中文字幕| 日韩精品欧美| 亚洲精品乱码| 神马午夜久久| 黄色亚洲大片免费在线观看| 99久久夜色精品国产亚洲狼 | 日韩av中文字幕一区二区三区| 免费视频一区二区三区在线观看| 香蕉国产精品| 日本在线一区二区三区| 国产66精品| 天使萌一区二区三区免费观看| 国产视频一区二| 日韩免费福利视频| 深夜福利亚洲| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 日本大胆欧美人术艺术动态| 欧美精品国产白浆久久久久| 成人精品天堂一区二区三区| 日韩在线电影| 亚洲夜间福利| 久久国产日韩欧美精品| 久久国产亚洲精品| 国产精品一区二区三区av麻| 欧美午夜不卡| 久久精品国产99| 亚洲一区日韩| www在线观看黄色| 日韩精品亚洲aⅴ在线影院| 97se综合| 国产精品久久久久9999高清| 在线精品观看| 99视频精品视频高清免费| 国产色99精品9i| 性色一区二区| 美女在线视频一区| 天堂久久av| 亚洲国产专区校园欧美| 国产激情欧美| 久久亚洲视频| 欧美日韩国产在线观看网站 | 亚洲一区二区毛片| 黑人精品一区| 久久超级碰碰| 日韩欧美中文在线观看|