vue實現(xiàn)自定義組件掛載原型上
自定義組件掛載原型上
以elementUI二次分裝dialog舉例
PageDialog.vue
<!-- 頁面提示彈框 --> <template> ? ? <el-dialog ? ? ? :visible.sync="show" ? ? ? class="page-dialog-wrapper" ? ? ? custom-class="page-dialog-component" ? ? ? :width="width" ? ? ? :append-to-body="true" ? ? ? :show-close="false" ? ? ? :close-on-click-modal="false"> ? ? ? <div class="container"> ? ? ? ? <div class="title"> ? ? ? ? ? <slot name='title-icon'> ? ? ? ? ? ? <i ? ? ? ? ? ? ? :class="titleIcon" ? ? ? ? ? ? ? v-if="titleIcon"> ? ? ? ? ? ? </i> ? ? ? ? ? </slot> ? ? ? ? ? {{title}} ? ? ? ? ? <i ? ? ? ? ? ? class="el-icon-close close-btn" ? ? ? ? ? ? @click="close" ? ? ? ? ? ? v-if="showClose"> ? ? ? ? ? </i> ? ? ? ? </div> ? ? ? ? <div class="content"> ? ? ? ? ? <slot> ? ? ? ? ? ? <div class="text" v-html="message"></div> ? ? ? ? ? </slot> ? ? ? ? ? <div class="btns" v-if="showConfirm || showCancel"> ? ? ? ? ? ? <el-button ? ? ? ? ? ? ? class="btn cancel" ? ? ? ? ? ? ? @click="close" ? ? ? ? ? ? ? v-if="showCancel"> ? ? ? ? ? ? ? {{cancelText}} ? ? ? ? ? ? </el-button> ? ? ? ? ? ? <el-button ? ? ? ? ? ? ? class="btn" ? ? ? ? ? ? ? @click="confirm" ? ? ? ? ? ? ? v-if="showConfirm"> ? ? ? ? ? ? ? {{confirmText}} ? ? ? ? ? ? </el-button> ? ? ? ? ? </div> ? ? ? ? </div> ? ? ? </div> ? ? </el-dialog> </template>
<script> /** ?* slot: ?* ?default:提示文本區(qū)域,默認 ?* ?title-icon:標題前面的icon ?* function: ?* ?confirm:確認按鈕點擊 ?* ?close:取消及關閉按鈕點擊 ?*/ export default { ? name: 'PageDialogComponent', ? components: {}, ? props: { ? ? show: { // 隱藏顯示 ? ? ? type: Boolean, ? ? ? default: false, ? ? }, ? ? width: { // 寬度 ? ? ? type: String, ? ? ? default: '600px', ? ? }, ? ? title: { // 標題 ? ? ? type: String, ? ? ? default: '提示', ? ? }, ? ? titleIcon: { // 標題icon ? ? ? type: String, ? ? ? default: '', ? ? }, ? ? showCancel: { // 是否顯示取消按鈕 ? ? ? type: Boolean, ? ? ? default: false, ? ? }, ? ? cancelText: { // 取消按鈕文本 ? ? ? type: String, ? ? ? default: '取消', ? ? }, ? ? showConfirm: { // 是否顯示確認按鈕 ? ? ? type: Boolean, ? ? ? default: true, ? ? }, ? ? confirmText: { // 確認按鈕文本 ? ? ? type: String, ? ? ? default: '確定', ? ? }, ? ? message: { // 提示內(nèi)容 ? ? ? type: String, ? ? ? default: '這里是提示語', ? ? }, ? ? showClose: { // 是否顯示關閉按鈕 ? ? ? type: Boolean, ? ? ? default: true, ? ? }, ? }, ? methods: { ? ? // 確定 ? ? confirm() { ? ? ? this.$emit('confirm'); ? ? }, ? ? // 關閉 ? ? close() { ? ? ? this.$emit('close'); ? ? }, ? }, }; </script>
<style lang='less' scoped> // 樣式區(qū) </style>
同目錄新建index.js
import vue from 'vue'; // 這里就是我們剛剛創(chuàng)建的那個靜態(tài)組件 import pageDialog from './PageDialog.vue'; // 返回一個 擴展實例構(gòu)造器 const DialogConstructor = vue.extend(pageDialog); // 定義彈出組件的函數(shù) function showDialog(options) { ? return new Promise((resolve, reject) => { ? ? const dialogDom = new DialogConstructor({ ? ? ? el: document.createElement('div'), ? ? }); ? ? dialogDom.width = options.width || dialogDom.width; ? ? dialogDom.title = options.title || dialogDom.title; ? ? dialogDom.titleIcon = options.titleIcon || dialogDom.titleIcon; ? ? dialogDom.showCancel = options.showCancel || dialogDom.showCancel; ? ? dialogDom.cancelText = options.cancelText || dialogDom.cancelText; ? ? dialogDom.showConfirm = options.showConfirm || dialogDom.showConfirm; ? ? dialogDom.confirmText = options.confirmText || dialogDom.confirmText; ? ? dialogDom.message = options.message || dialogDom.message; ? ? dialogDom.showClose = options.showClose || dialogDom.showClose; ? ? dialogDom.show = true; ? ? document.body.appendChild(dialogDom.$el); ? ? dialogDom.confirm = function () { // 確定按鈕 ? ? ? resolve(); ? ? ? dialogDom.show = false; ? ? }; ? ? dialogDom.close = function () { // 取消按鈕 ? ? ? reject(); ? ? ? dialogDom.show = false; ? ? }; ? }); } // 注冊為全局組件的函數(shù) function registryDialog() { ? // 將組件注冊到 vue 的 原型鏈里去, ? // 這樣就可以在所有 vue 的實例里面使用 this.$pageDialog() ? vue.prototype.$pageDialog = showDialog; } export default registryDialog;
main.js中引入
import pageDialog from '../components/page-dialog/index'; Vue.use(pageDialog)
可以html組件使用
? ? <!-- 刪除前提示 --> ? ? <page-dialog ? ? :show="showDialog" ? ? showCancel ? ? message="確認刪除已選產(chǎn)品?" ? ? @confirm="deleteChoose" ? ? @close="showDialog = false"/>
或者在js中使用
? ? ? ? this.$pageDialog({ ? ? ? ? ? message: '審核后的訂單有部分發(fā)生變化,確定按調(diào)整后訂單支付?', ? ? ? ? ? showCancel: true, ? ? ? ? ? cancelText: '我在想想', ? ? ? ? }).then(() => { ? ? ? ? // 搞事情 ? ? ? ? }).catch(() => { ? ? ? ? // 搞事情 ? ? ? ? });
在原型上掛載方法和組件
掛在方法,在main.js中
Vue.prototype.langs = function lang(en, id, zh) { ? const L = this.language ? switch (L) { ? ? case 'en': ? ? ? return en || '' ? ? case 'id': ? ? ? return id || '' ? ? case 'zh': ? ? ? return zh || '' ? } }
使用:this.langs()
注意:
1、如當前頁面中的方法與原型方法名字一致,則會覆蓋原型的方法
2、如果原型方法太多寫在main.js中會贅余,所以一般在另外創(chuàng)建一個js文件,這個js文件都是全部寫原型的方法,然后引入到main.js當中,然后把它放在這個位置
new Vue({ ? el: '#app', ? router, ? store, ? test, // 比如這個就是js文件,放到vue上面 ? components: { App }, ? template: '<App/>' })
掛載組件
import testA from '@/A' Vue.component('testA ', testA )
使用:<testA></testA>或者<test-a><test-a/>
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
vue+element 模態(tài)框表格形式的可編輯表單實現(xiàn)
這篇文章主要介紹了vue+element 模態(tài)框表格形式的可編輯表單實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06vue uniapp 防止按鈕多次點擊的三種實現(xiàn)方式
最近的項目完成后,在性能優(yōu)化階段需要做按鈕的防止重復點擊功能,本文主要介紹了vue uniapp 防止按鈕多次點擊的三種實現(xiàn)方式,具有一定的參考價值,感興趣的可以了解一下2023-08-08vue使用element-ui tabs切換echarts解決寬度100%方式
這篇文章主要介紹了vue使用element-ui tabs切換echarts解決寬度100%方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07關于el-table-column的formatter的使用及說明
這篇文章主要介紹了關于el-table-column的formatter的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10