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>
    Vue 2 표기 법
    Vue 2 에서 저 는 개인 적 으로 플러그 인 으로 쓰 는 것 이 좋 을 것 같 습 니 다.다음 과 같이 실 현 됩 니 다.혼합 을 사용 하여 작업 을 하고 업무 와 결합 을 풀 었 습 니 다.
    좀 안 좋 은 점 은 구성 요소 가 동적 으로 삽 입 된 것 입 니 다.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()
      }
    })
    
    Vue 3 플러그 인 버 전 쓰기
    안 좋 은 것 은 Vue 3 의 업그레이드 Vue.extend 가 없어 졌 고$mount 도 없어 졌 기 때문에 구성 요 소 는 응용 프로그램 에서 만 렌 더 링 할 수 있 습 니 다.
    모든 응용 프로그램 간 의 데 이 터 는 격 리 되 어 있 기 때문에 플러그 인 같은 것 은 다시 도입 해 야 합 니 다.또한 상호작용 을 하려 면 귀 찮 습 니 다.같은 vuex 인 스 턴 스 를 도입 하면 되 겠 지만 별로 시도 하지 않 았 습 니 다.
    낮은 결합 을 위해 서 는 렌 더 링 을 마 운 트 하기 위해 새 애플 리 케 이 션 을 만 들 수 있 습 니 다.
    
    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'))
            })
        }
      }
    }
    
    
    Vue 3 동적 구성 요소 쓰기
    Vue 3 에서 플러그 인 버 전의 쓰기 도 요구 에 도 달 했 지만 완전히 새로운 인용 응용 프로그램 입 니 다.업무 중 this.$root,vuex,router 를 방문 하면 좀 귀 찮 습 니 다.
    그래서 Vue 3 에 서 는 동적 구성 요 소 를 쓰 는 게 좋 을 것 같 아 요.
    루트 구성 요소 에 동적 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 의 표기 법
    vue 3 구성 요소 인 스 턴 스 가 져 오기 응용 인 스 턴 스
    
    vm.$.appContext.app == app
    
    vue 3 인 스 턴 스 를 사용 하여 구성 요소 인 스 턴 스 를 가 져 옵 니 다.주의instance 는 dev 환경 에서 만 접근 할 수 있 습 니 다.
    
    app._instance.proxy == vm
    app._instance.root.proxy == vm
    app._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 패 키 징 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기