zoukankan      html  css  js  c++  java
  • 通过Vue.extned动态创建组件

    官方文档:https://cn.vuejs.org/v2/api/#Vue-extend

    vue.extend使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

    extend是产生一个继承自Vue类的子类,只会影响这个子类的实例对象,不会对Vue类本身以及Vue类的实例对象产生影响。

    vue.extend相当于一个扩展实例构造器,用于创建一个具有初始化选项的Vue子类,在实例化时可以进行扩展选项,最后使用$mount方法绑定在元素上。

    通过vue.extend动态创建做全局toast

    首先创建一个toast.vue文件,该文件不写data数据

    <template>
      <transition name="toast-transition">
        <div v-show="show" class="toast">
          <div class="toast-content">{{ content }}</div>
        </div>
      </transition>
    </template>
    <style scoped>
    .toast {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      position: fixed;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 10;
      pointer-events: none;
    }
    .toast-content {
      max- 320px;
      padding: 10px 30px;
      border-radius: 10px;
      background-color: rgba(0, 0, 0, 0.8);
      font-size: 30px;
      color: #fff;
      line-height: 60px;
    }
    .toast-transition-enter-active,
    .toast-transition-leave-active {
      transition: opacity 0.5s;
    }
    .toast-transition-leave,
    .toast-transition-enter-to {
      opacity: 1;
    }
    .toast-transition-enter,
    .toast-transition-leave-to {
      opacity: 0;
    }
    </style>

    创建一个toast.js文件,,通过vue.extend方法动态创建toast文件,

    引入toast组件
    import Vue from 'vue' import toast from './toast.vue' // 动态创建组件 function showToast(content, duration = 2000) {
      // 这里创建的ToastConstructor是toast的构造函数,类似于Vue构造函数,需要通过new实例化它
    const ToastConstructor = Vue.extend(toast);

      // ToastDom是toast组件的实例,它上面有很多实例属性 let ToastDom
    = new ToastConstructor({ el: document.createElement('div'), data() { return { show: true, content }; } });
      // 元素插入body中 document.body.appendChild(ToastDom.$el);   

      // 2秒后隐藏,组件销毁,ToastDom设置为null,让垃圾回收机制回收 setTimeout(()
    => { ToastDom.show = false; setTimeout(() => { document.body.removeChild(ToastDom.$el); ToastDom.$destroy(); ToastDom = null; console.log(ToastDom); },500); },duration); } export default { install() { Vue.prototype.$toast = showToast; } };

    调用

    <script>
    export default {
      created() {
        this.$toast('hello world');
      }
    }
    </script>

    用vue.extend动态创建toast缺点:

    1、每次调用都会操作DOM,如每次都会往body里面插入元素,调用完又会移除这个元素

    2、每次调用都会创建一次组件实例

     extend使用场景

    1、当你需要在某一个场景内要使用一个新功能,该新功能只是在某组件上作一些新的逻辑新功能即可

  • 相关阅读:
    敏捷思维-架构设计中的方法学(12)Refactoring
    敏捷思维-架构设计中的方法学(11)精化和合并
    敏捷思维-架构设计中的方法学(8)架构愿景
    敏捷思维-架构设计中的方法学(10)分层 (下)
    Agile 敏捷建模思想 作者:林星
    敏捷思维-架构设计中的方法学(9)分层 (上)
    敏捷思维-架构设计中的方法学(13)稳定化
    敏捷思维-架构设计中的方法学(15)进一步阅读
    hdu 1829+hdu 1856(并查集)
    hdu 1050+hdu 1789+hdu 3177(贪心)
  • 原文地址:https://www.cnblogs.com/ltog/p/14331780.html
Copyright © 2011-2022 走看看