返回
Featured image of post Vue动态创建全局组件

Vue动态创建全局组件

Vue动态创建全局组件

创建全局组件

  • 这是我准备的组件目录结构

  • 创建功能组件HelloWorld.vue,组件功能很简单,就是类似弹出框的功能

    <template>
      <div class="hello">
        <h1 v-if="isShow">{{ msg }}</h1>
      </div>
    </template>
    
    <script>
    export default {
      name: 'HelloWorld',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App',
          isShow: false
        }
      }
    }
    </script>
    
  • 创建HelloWorld_com.js

    • 引入Vue与功能组件

      import Vue from 'vue'
      import Hellow from './HelloWorld.vue'
      
    • 生成构造器

      const HellowConstructor = Vue.extend(Hellow)
      
    • 封装

      function showHello( _t, _time = 2000) {
          let _dom = new HellowConstructor({
              el: document.createElement('div'), // 生成DOM节点
              data() {
                  return {
                      msg: _t, // 创建的功能组件中的msg
                      isShow: true // 创建的功能组件中的isShow,控制显隐式
                  }
              }
          })
      
          document.body.appendChild(_dom.$el) // 将创建的DOM挂载到body
      
          setTimeout(() => { _dom.isShow = false }, _time) // 设置显隐式时间
      }
      
    • 全局组件,挂载到Vue的原型,并导出

      function helloReg() {
          Vue.prototype.$showHello = showHello
      }
      
      export default helloReg
      
    • 在main.js中引入并全局使用

      import showHellow from './components/HelloWorld_com/HelloWorld_com'
      
      Vue.use(showHellow)
      

使用全局组件

  • 我是在app中直接使用 (因为已经绑在Vue原型上了,所以直接this.$XXX传入需要的参数使用)

    <template>
      <div id="app">
        <button @click="showHello">点击</button>
        <router-view/>
      </div>
    </template>
    
    <script>
    export default {
      name: 'App',
      methods: {
        showHello() {
          this.$showHello('hello,', 5000)
        }
      }
    }
    </script>
    
  • 效果图

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy