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

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

Vue實現Dialog封裝

瀏覽:125日期:2022-09-28 11:56:38
目錄Vue2 寫法Vue3 插件版寫法Vue3 動態組件寫法一些比較 hack 的寫法

在寫業務的時候很常見的一個場景就是需要在不同的頁面調用同一個表單,常用的交互就是把表單以彈窗的形式展示,但是在每個頁面又重復的引入表單組件有時候又很麻煩

Vue實現Dialog封裝

解決方案有兩個:

在根組件里面引入動態組件,在業務里面通過this.$root.openDialog(name, props)去控制動態組件的展示形式 封裝成插件的形式去調用,比如this.$dialog(’EditDialog.vue’, props)

當然了,業務 Dialog 組件要有一套規范,props 接收一個 onOk、onCancel 回調,data 里面定義一個 visible 屬性

<template> <el-dialog :title='title' :visible.sync='visible' append-to-body> <!-- 業務代碼 --> </el-dialog></template><script>export default { props: [’onOk’, ’其他業務需要的屬性’], data() { return { visible: false } }}</script>Vue2 寫法

在 Vue2 里面我個人感覺寫成插件是比較好用的,實現如下,使用混入做了一些操作,和業務進行解耦

有點不太好的地方是組件是動態插入的,Vue devtools 要刷新下才能看到組件

const mixin = { mounted() { document.body.appendChild(this.$el) this.visible = true }, watch: { visible(value) { // 動畫結束后銷毀實例 if (value === false) {setTimeout(() => { this.$destroy() if (this.$el && this.$el.parentNode) { this.$el.parentNode.removeChild(this.$el) }}, 400) } } }}export default { install(Vue, options) { Vue.prototype.$dialog = (name, props) => { // 相對于該插件的位置,靜態編譯期間會檢查的 import(’../components/dialogs/’ + name).then(module => { const component = module.default const mixins = component.mixins || [] mixins.push(mixin) // 實現自動打開,動態了混入生命周期函數和銷毀操作 component.mixins = mixins return Vue.extend(component)}).then(Dialog => { const dialog = new Dialog({ propsData: props || {} }) dialog.$mount()}) } }}

調用方式如下,注意 onOk 回調的 this 指向,使用箭頭函數直接就避免了 😎

this.$dialog(’GroupEdit.vue’, { type: ’edit’, group: {}, onOk: () => { this.freshList() }})Vue3 插件版寫法

很糟糕的是,由于 Vue3 的升級Vue.extend沒有了,$mount也沒有了,組件只能在應用里面去渲染

每個應用之間的數據是隔離的,所以插件什么的都要重新引入。同時如果要交互交互的話也比較麻煩,引入同一個 vuex 實例應該可以,但是沒怎試

為了低耦合只能去新建一個應用去掛載渲染

Vue實現Dialog封裝

import { createApp, defineComponent } from ’vue’import ElementPlus from ’element-plus’const mixin = { mounted() { document.body.appendChild(this.$el) this.visible = true }, watch: { visible(value) { // 動畫結束后銷毀實例 if (value === false) {setTimeout(() => { this.$.appContext.app.unmount()}, 400) } } }}export default { install(app) { app.config.globalProperties.$dialog = (name, props) => { import(’../components/dialogs/’ + name).then(module => { const component = module.default let mixins = component.mixins || [] mixins.push(mixin) component.mixins = mixins return defineComponent(component)}).then(Dialog => { const app = createApp(Dialog, props || {}) app.use(ElementPlus) app.mount(document.createElement(’div’))}) } }}Vue3 動態組件寫法

在 Vue3 里面,插件版的寫法同樣達到了要求,但是完全是一個新引應用了,如果在業務里訪問this.$root,vuex,router還是有點麻煩的

所以 Vue3 里面還是動態組件的寫法比較好

在根組件引入動態 component,定義一些控制變量

<template> <router-view></router-view> <component :is='currentDialog' v-bind='currentDialogProps' /></template><script>export default { data() { return { currentDialog: null, currentDialogProps: null } }}</script>

調用的的話this.$root.$dialog(),看起來太難看,其實還是可以手動模擬插件的效果的

const app = createApp(App)const vm = app.mount(’#app’)initDialog(app, vm)function initDialog(app, vm) { const mixin = { mounted() { this.visible = true }, watch: { visible(value) {// 動畫結束后銷毀實例if (value === false) { setTimeout(() => { this.$root.currentDialog = null this.$root.currentDialogProps = {} }, 400)} } } } app.config.globalProperties.$dialog = (name, props) => { import(’./components/dialogs/’ + name).then(module => { const component = module.default let mixins = component.mixins || [] mixins.push(mixin) component.mixins = mixins // 不需要 defineComponent(component) vm.currentDialog = markRaw(component) vm.currentDialogProps = markRaw(props || {}) }) }}一些比較 hack 的寫法

vue3 組件實例獲取應用實例

vm.$.appContext.app == app

vue3 應用實例獲取組件實例,注意_instance 僅在 dev 環境能訪問到

app._instance.proxy == vmapp._instance.root.proxy == vmapp._instance.ctx.$root == vm

騷操作還是有的,但是最好不要用

const app = createApp(App)const vm = app.mount(’#app’)if (process.env.NODE_ENV === ’production’) { app._instance = { proxy: vm, root: { proxy: vm }, ctx: { $root: vm } }}

到此這篇關于Vue實現Dialog封裝的文章就介紹到這了,更多相關Vue Dialog封裝內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲综合专区| 中文字幕日韩高清在线| 日韩精品欧美成人高清一区二区| 国产精品99一区二区| 久久精品123| 日韩国产网站| 久久青草久久| 蜜臀久久99精品久久一区二区| 麻豆精品视频在线| 精品网站999| 欧美日韩免费看片| 亚洲午夜91| 男人的天堂久久精品| 日本在线不卡视频| 国产日韩欧美中文在线| 麻豆精品视频在线观看视频| 国产精品成人a在线观看| 国产suv精品一区| 成人看片网站| 国产视频一区欧美| 精品视频一区二区三区在线观看 | 日韩av午夜在线观看| 日韩欧美激情电影| 美日韩一区二区三区| 黄色精品视频| 欧美亚洲激情| 婷婷亚洲精品| 国产免费久久| 美女网站视频一区| 先锋影音久久久| 日韩中出av| 国产福利一区二区精品秒拍| caoporn视频在线| 99久久99视频只有精品| 免费成人在线影院| 国产精品毛片aⅴ一区二区三区| 婷婷色综合网| 国产日韩视频在线| 亚洲大片在线| 日韩视频一二区| 色综合五月天| 久热精品在线| 精品一区二区男人吃奶| 久久人人精品| 91成人小视频| 日韩精品专区| 免费看欧美美女黄的网站| 国产精品一区二区av交换| 欧美一区久久久| 亚洲日韩视频| 中文字幕高清在线播放| 美女久久一区| 国产一区二区三区不卡视频网站 | 夜夜嗨一区二区三区| 欧美一级网址| 日韩精品永久网址| 亚洲久久一区| 亚洲成a人片| 婷婷五月色综合香五月| 国产成人免费av一区二区午夜| 久久在线免费| 日韩av网站免费在线| 国产在线|日韩| 国产亚洲精aa在线看| 亚洲成a人片| 国产精品一区二区三区四区在线观看 | 一本色道久久精品| 亚州精品视频| 日韩一区电影| 日本午夜免费一区二区| 成人精品亚洲| 91精品麻豆| 日韩网站中文字幕| 国产乱码精品一区二区亚洲| 色偷偷色偷偷色偷偷在线视频| 亚洲精品在线二区| 激情国产在线| 欧美在线日韩| 99re国产精品| 在线看片国产福利你懂的| 日韩精品一级中文字幕精品视频免费观看| 精品一区二区三区免费看| 亚洲欧洲美洲国产香蕉| 色天使综合视频| 国产精品视频一区二区三区 | 青青国产91久久久久久| 中文字幕乱码亚洲无线精品一区| 久久激情中文| 精品一区二区三区视频在线播放| 婷婷综合电影| 中国女人久久久| 色88888久久久久久影院| 国产精品一区2区3区| 最新国产精品视频| 免费精品视频| 欧美精品一区二区久久| 日本亚洲欧洲无免费码在线| 亚洲在线免费| 欧美特黄a级高清免费大片a级| 国产精选在线| 国模精品一区| 精品国产一区二| 久久精品资源| 国产欧美日韩在线一区二区 | 亚洲人成高清| 免费美女久久99| 国内精品99| 日韩电影免费网站| 国产精品毛片视频| 欧美在线观看天堂一区二区三区| 亚洲青青久久| 午夜久久av| 日韩动漫一区| 欧美亚洲专区| 欧美韩一区二区| 欧美a级一区二区| 嫩呦国产一区二区三区av| 国产精品一级| 国产精品xxxav免费视频| 欧美在线看片| 日韩精品免费一区二区三区| 亚洲永久精品唐人导航网址| 亚洲一区国产| 亚洲深深色噜噜狠狠爱网站 | 日本亚洲不卡| 欧美13videosex性极品| 日本激情一区| 国产一区二区三区四区五区| 国产精品调教视频| 欧美韩日一区| 捆绑调教美女网站视频一区 | 亚洲欧洲日本mm| 日本成人手机在线| 久久夜夜操妹子| 日本欧美韩国一区三区| 99久久亚洲精品蜜臀| 综合日韩av| 国产毛片一区二区三区| 久久精品99国产精品| 欧美日韩91| 九九九精品视频| 欧美国产美女| 久久精品官网| aⅴ色国产欧美| 中文字幕一区二区三区四区久久 | 国产精品99在线观看| 99久久99久久精品国产片果冰| 99热精品在线观看| 一区二区三区国产在线| 日韩av一区二| 色婷婷综合网| 尹人成人综合网| 婷婷精品在线观看| 国产在线观看91一区二区三区| av高清不卡| 香蕉成人久久| 久久成人av| 99久久夜色精品国产亚洲狼| 久久xxxx| 91精品丝袜国产高跟在线| 久久尤物视频| 免费黄色成人| 欧美一级网址| 久久狠狠婷婷| 日本中文字幕一区二区视频| 国产欧美日韩一级| 亚洲啊v在线| 免费不卡在线观看| 国产高清亚洲| 1000部精品久久久久久久久| 亚洲综合五月| 国产欧洲在线| 视频在线观看91| 久久伊人国产| 免费日韩av片| 久久久久观看| 视频一区二区三区中文字幕| 欧美日韩xxxx| 99精品视频在线| 国产午夜一区| 成人av动漫在线观看| 欧美欧美黄在线二区| 日韩精品久久久久久久电影99爱| 日韩精品亚洲专区在线观看| av最新在线| 午夜天堂精品久久久久| 高清不卡亚洲| 蜜桃传媒麻豆第一区在线观看| 成人黄色av| 中文字幕av亚洲精品一部二部| 精品伊人久久久| 视频在线观看一区| 麻豆国产在线| 日本va欧美va精品| 在线成人直播| 精品在线网站观看| 日韩一区免费| 偷拍欧美精品| 国产美女高潮在线| 日韩av一区二区三区|