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

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

Vue實現Dialog封裝

瀏覽:123日期: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国产精品久久久久久久成人热| av高清不卡| 国产极品一区| 久久99久久久精品欧美| 国产一区二区三区黄网站| 亚洲天堂免费电影| 午夜在线播放视频欧美| 日韩福利视频一区| 国产精品成人a在线观看| 麻豆免费精品视频| 国产91一区| 综合激情网...| 久久一区欧美| 日韩三区免费| 日本va欧美va瓶| 成人精品高清在线视频| 国产综合精品一区| 色综合视频一区二区三区日韩| 日韩激情啪啪| 成人一区而且| 亚洲一卡久久| 国产激情久久| 在线国产一区二区| 麻豆成人91精品二区三区| 国产一区二区三区久久| 亚洲精品99| 精品理论电影在线| 免费在线观看视频一区| 精品福利久久久| 在线观看亚洲精品福利片| 精品国产91| 青草久久视频| 蜜臀久久99精品久久一区二区| 国产精品白丝久久av网站| 美女久久一区| 99精品电影| 国产精品成久久久久| 国产乱码精品一区二区亚洲| 蜜桃av一区二区| 日韩免费高清| 久久午夜影院| 免费观看在线色综合| 国产黄大片在线观看| 国产成人精品福利| 欧美精品97| 久久成人av| 国产精品一区二区av日韩在线| 丝袜美腿高跟呻吟高潮一区| 久久中文视频| 欧洲av一区二区| 日韩黄色大片网站| 国产69精品久久| 91亚洲国产高清| 日本一区二区高清不卡| 国产欧美一区| 国产精品多人| 精品99在线| 久久久久欧美精品| 在线精品小视频| 在线一区二区三区视频| 亚洲人成精品久久久| 91成人在线网站| 精品视频网站| 91精品啪在线观看国产18 | 国产日韩电影| 999国产精品永久免费视频app| 激情五月综合网| 国产高清一区二区| 伊人精品久久| 免费日韩一区二区三区| 久久久成人网| 日韩不卡免费视频| 欧美成人a交片免费看| 国产一区导航| 91一区二区三区四区| 国产精品嫩草99av在线| 日韩欧美一区二区三区免费看| 精品资源在线| 国产精品久久观看| 日韩欧美网址| 一本色道精品久久一区二区三区| 伊人精品在线| 国产精品99免费看| 亚洲视频国产| 国产极品嫩模在线观看91精品| 9999国产精品| 麻豆91精品| 久久精品色播| 欧美中文日韩| 欧美激情日韩| 欧美va天堂| 国产欧美日韩影院| 伊人久久高清| 日本亚洲欧洲无免费码在线| 久久影院资源站| 久久久久久久久99精品大| 日精品一区二区三区| 国产精品夜夜夜| 在线亚洲精品| 久久97视频| 丝袜亚洲精品中文字幕一区| 给我免费播放日韩视频| 老鸭窝毛片一区二区三区| 欧美激情视频一区二区三区免费 | 亚洲丝袜啪啪| av一区在线| 国产极品模特精品一二| 久久久水蜜桃av免费网站| 亚洲在线久久| 亚洲www啪成人一区二区| 亚洲精品免费观看| 久久国产中文字幕| 美女久久久久久 | 欧美色图一区| 国产精品第一| 欧美日韩国产综合网| 麻豆国产精品| 免费观看在线综合色| 日韩精品免费一区二区在线观看 | 欧美在线资源| 伊伊综合在线| 欧美韩一区二区| 国产极品模特精品一二| 亚洲精品影视| 免费人成在线不卡| 丝袜美腿一区二区三区| 黑丝一区二区| 九九久久电影| 亚洲激情欧美| 午夜国产精品视频| 欧美日韩国产v| 久草免费在线视频| 中文字幕在线免费观看视频| 日韩av二区| 日韩在线视频精品| 91精品亚洲| 99国产精品久久久久久久成人热| 激情六月综合| 9色国产精品| 最新国产精品视频| 日韩高清一区在线| 国产精品羞羞答答在线观看| 久久av导航| 日韩在线第七页| 亚洲激情久久| 日韩一区欧美二区| 亚洲最新av| 国产精品久久乐| 亚洲黄色免费av| 影音国产精品| 日韩精品第一| 精品视频国产| 国产精品婷婷| 精品在线网站观看| 午夜久久一区| 国产精品一区毛片| 免费av一区二区三区四区| 日韩视频1区| www.九色在线| 日韩精品视频中文字幕| 国产福利资源一区| 久久国产直播| 国产亚洲精品精品国产亚洲综合| 狠狠久久伊人| 香蕉久久夜色精品国产| 国产欧美精品| 国产在线成人| 久久99国产精品视频| 综合一区在线| 国产高清一区| 日韩福利一区| 国产精品久久久久久妇女 | 亚洲毛片在线免费| 日韩一区亚洲二区| 中文字幕日韩亚洲| 伊人久久av| 久久久国产精品网站| 日韩三级精品| 日韩精品一二区| 亚洲黑丝一区二区| 国产一区二区亚洲| 欧美激情aⅴ一区二区三区 | 奶水喷射视频一区| 综合日韩av| 国产精品nxnn| 91麻豆精品激情在线观看最新| 国产主播一区| 成人午夜亚洲| 98精品久久久久久久| 国产精品白丝av嫩草影院| 日本午夜精品久久久久| 另类亚洲自拍| 蘑菇福利视频一区播放| 欧美网站在线| 亚洲欧美日韩视频二区| 蜜乳av另类精品一区二区| 亚洲中字黄色| 免费在线亚洲欧美| 国产免费久久|