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

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

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

瀏覽:182日期: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’// 返回一個 擴展實例構(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(’是否確認刪除’) .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的示例的詳細內(nèi)容,更多關(guān)于vue自定義插件封裝的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Vue
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩av免费大片| 国内揄拍国内精品久久| av最新在线| 亚洲国产成人二区| 鲁鲁在线中文| 99久精品视频在线观看视频| 亚洲香蕉网站| 中文一区二区| 天海翼精品一区二区三区| 91超碰国产精品| 日本欧洲一区二区| 青青国产91久久久久久| 国产欧美日韩亚洲一区二区三区| 国产精品久久久久9999高清| 国产精品精品| 婷婷精品进入| 国产欧美激情| 成人精品视频| 鲁大师成人一区二区三区| 日韩欧美中文字幕电影| 国产中文欧美日韩在线| 国产一区观看| 日韩高清一级| 精品伊人久久| 伊人久久大香线蕉av不卡| 亚洲精品1区2区| 欧美日韩亚洲一区三区| 色网在线免费观看| 99在线观看免费视频精品观看| 91午夜精品| 好吊日精品视频| 另类小说一区二区三区| 国产一区导航| 国产日韩欧美在线播放不卡| 不卡一二三区| 日韩av网站在线免费观看| 亚洲伦乱视频| 欧美一区二区三区久久精品| 99精品在线| 日韩av中文字幕一区二区三区| 国产成人精品一区二区三区视频| 欧美成人日韩| 久久伊人久久| 日韩不卡一二三区| 欧美在线亚洲综合一区| 久久一区亚洲| 欧美亚洲国产日韩| 蜜臀av在线播放一区二区三区 | 日韩和欧美的一区| 亚洲免费播放| 欧美成人亚洲| av在线最新| 久久爱www成人| 国产婷婷精品| 午夜免费一区| 欧美成人日韩| 99国产精品免费视频观看| 欧美精品97| 国产日韩欧美一区二区三区在线观看 | 色老板在线视频一区二区| 国产激情久久| 国产精品日本一区二区不卡视频 | 国产精品蜜芽在线观看| 精品午夜av| 久久精品免费看| 亚洲天堂免费电影| 国产精品99免费看| 国产99久久久国产精品成人免费| 亚洲精品成人图区| 黄色精品网站| 日韩一区精品| 麻豆国产精品777777在线| 国内在线观看一区二区三区 | 色婷婷色综合| 国产精品天堂蜜av在线播放| 亚洲成人不卡| 日韩av黄色在线| www.com.cn成人| 亚洲深深色噜噜狠狠爱网站| 日韩高清国产一区在线| 国产成人在线中文字幕| 日韩一区二区免费看| 久久99影视| 另类国产ts人妖高潮视频| 视频一区日韩| 国产va免费精品观看精品视频| 在线亚洲免费| 日韩大片在线播放| 一区二区精品| 五月天久久久| 精品一区二区三区中文字幕视频| 狠狠久久婷婷| 91综合网人人| 日韩激情精品| 性色一区二区| 日韩精品欧美| 国产精品成人一区二区不卡| 日韩国产在线不卡视频| 亚洲午夜一级| 国产一区二区三区日韩精品| 日韩福利在线观看| 亚洲天堂日韩在线| 99国产精品久久久久久久成人热 | 国产精品毛片aⅴ一区二区三区| 国产高清一区二区| 亚洲天堂免费电影| 精品视频在线一区二区在线| 亚洲精品动态| 丝袜美腿亚洲色图| 在线视频日韩| 欧美va天堂在线| 久久久蜜桃一区二区人| 日韩精品dvd| 丁香六月综合| 日本久久综合| 国产精品久久久久毛片大屁完整版| 久久亚洲不卡| 美女被久久久| 国产精品免费看| 欧美日韩精品一本二本三本| 欧美亚洲在线日韩| 亚洲电影在线| 亚洲免费一区二区| 蜜桃视频第一区免费观看| 自拍自偷一区二区三区| 亚洲精品三级| 国产调教精品| 久久久久黄色| 三级精品视频| 中文欧美日韩| 三级在线观看一区二区| 在线一区二区三区视频| 亚洲一二av| 国产欧美日韩精品一区二区三区| 国产精品777777在线播放| 国产精品国产一区| 欧美精品羞羞答答| 蜜桃av一区二区| 国产精品亚洲欧美| 成人片免费看| 亚洲一区二区小说| 久久97视频| 亚洲在线观看| 欧美黄色精品| 国产一区二区精品| 久久国产精品免费精品3p| 成人美女视频| 深夜福利一区| 性欧美xxxx免费岛国不卡电影| 亚洲精品人人| 超碰成人av| 日韩区欧美区| 免费在线成人网| 亚洲女同av| 久久91视频| 国产激情久久| 欧美中文日韩| 91国语精品自产拍| 日韩在线看片| 国产suv精品一区二区四区视频| 99久精品视频在线观看视频| 国产亚洲字幕| 蜜臀av一区二区三区| 伊伊综合在线| 欧美激情三区| 日本久久二区| 一区二区精品| 国产模特精品视频久久久久| 99久久九九| 国产一区日韩一区| 色婷婷精品视频| 欧美国产三级| 中文字幕免费精品| 久久国产精品99国产| 亚洲精品91| av在线日韩| 荡女精品导航| 欧美交a欧美精品喷水| 国产亚洲字幕| 日韩精品免费观看视频| 亚洲人成高清| 亚洲不卡视频| 18国产精品| 国产九一精品| 国产精品日本一区二区三区在线| 青草久久视频| 成人台湾亚洲精品一区二区| 人人精品亚洲| 国产精品美女久久久浪潮软件| 在线观看精品| 激情综合自拍| 日韩一区二区三区精品| 中文字幕日本一区| 久久精品国产久精国产| 亚洲三级精品| 亚洲另类视频| 日韩国产欧美在线视频| 日本成人在线一区| 国产情侣一区| 国产99在线|