电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

這次封裝基于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.$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>

然后書寫對應的toast.ts

import Vue from ’vue’;// toast組件import toastComponent from ’@/components/toast/index.vue’// 返回一個 擴展實例構造器const ToastConstructor = Vue.extend(toastComponent)// 定義彈出組件的函數 接收2個參數, 要顯示的文本 和 顯示時間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)}// 注冊為全局組件的函數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自定義插件封裝,實現簡易的elementUi的Message和MessageBox的示例

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

主要用于操作的二次確定

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

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

<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>

對應的書寫confirm.ts

這里使用Promise來為用戶點擊確定或者取消做對應的交互觸發

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自定義插件封裝,實現簡易的elementUi的Message和MessageBox的示例

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

typescript對應的聲明文件

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

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

以上就是vue自定義插件封裝,實現簡易的elementUi的Message和MessageBox的示例的詳細內容,更多關于vue自定義插件封裝的資料請關注好吧啦網其它相關文章!

標簽: Vue
主站蜘蛛池模板: 中红外QCL激光器-其他连续-半导体连续激光器-筱晓光子 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 高低温老化试验机-步入式/低温恒温恒湿试验机-百科 | 上海乾拓贸易有限公司-日本SMC电磁阀_德国FESTO电磁阀_德国FESTO气缸 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 顺辉瓷砖-大国品牌-中国顺辉 | 哈希余氯测定仪,分光光度计,ph在线监测仪,浊度测定仪,试剂-上海京灿精密机械有限公司 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 管家婆-管家婆软件-管家婆辉煌-管家婆进销存-管家婆工贸ERP | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 上海道勤塑化有限公司| 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 陕西自考报名_陕西自学考试网| 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 南京泽朗生物科技有限公司-液体饮料代加工_果汁饮料代加工_固体饮料代加工 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 开云(中国)Kaiyun·官方网站-登录入口 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 |