zoukankan      html  css  js  c++  java
  • Vue挂在全局组件的两种方法

    1. 通过官方提供的一个全局api Vue.extend( options )
    import Vue from 'vue'
    
    export default (component, props) => {
      const conCtor = Vue.extend(component)
    
      const el = new conCtor({propsData: props}).$mount()
    
      document.body.appendChild(el.$el)
    
      conCtor.remove = () => {
        document.body.removeChild(el.$el)
        conCtor.$destroy()
      }
    
      return el
    }
    

      

    2. 通过new 一个Vue对象,通过这个Vue对象的render函数帮我们渲染这个虚拟dom
    import Vue from 'vue'
    
    export const create = (component, props) => {
      const vm = new Vue({
        render(h) {
          return h(component, {props})
        }
      }).$mount()
    
      document.body.appendChild(vm.$el)
    
      vm.remove = () => {
        document.body.removeChild(vm.$el)
        vm.$destroy()
      }
    
      return vm.$children[0]
    }
    

      

    以上两个方法均为生成一个挂在全局组件的工厂函数,可通过该函数生成任何需要全局挂在的组件。现举一个栗子,开发一个提示框(notice)组件,并使用上述函数挂在全局。
     
    1. 开发组件
    <template>
      <transition name="notice">
        <div class="notice-wrapper" v-if="isShow">
          <div class="notice-content">
            <h5 class="header">{{title}}</h5>
            <div class="body">{{content}}</div>
          </div>
        </div>
      </transition>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isShow: false
        }
      },
    
      props: {
        title: {
          type: String,
          default: '提示'
        },
    
        content: {
          type: String,
          default: ''
        },
    
        duration: {
          type: Number,
          default: 3000
        }
      },
    
      mounted() {
        this.isShow = true
      },
    
      created() {
        if (this.duration === 0) return
    
        this.timer = setTimeout(() => {
          this.isShow = false
        }, this.duration)
      },
    
      methods: {
        hide() {
          this.isShow = false
        }
      }
    }
    </script>
    
    <style scoped lang="less">
    .notice-wrapper {
      position: absolute;
      height: 100%;
       100%;
      left: 0;
      top: 0;
      background: inherit;
    
      &::after {
        content: '';
        position: absolute;
        display: block;
        left: 0;
        top: 0;
        height: 100%;
         100%;
        background: #eee;
        opacity: 0.1;
      }
    
      .notice-content {
        position: relative;
        box-sizing: border-box;
         80%;
        margin: 0 auto;
        top: 50%;
        transform: translateY(-50%);
        padding: 10px;
        background: #1989fa;
        color: #fff;
        box-shadow: 0px 0px 2px 2px #ccc;
        border-radius: 5px;
    
        .header {
          padding: 0 0 20px 0;
          margin: 0;
          font-size: 16px;
        }
      }
    }
    
    .notice-enter,
    .notice-leave-to {
      opacity: 0;
    }
    
    .notice-enter-active,
    .notice-leave-active {
      transition: opacity 0.5s;
    }
    </style>
    
    2. 暴露组件挂载全局的注册方法install,以及便捷封装方法success以及fail
    import NoticeComponent from './Notice.vue'
    
    import createComponent from '../utils/create-component.js'
    
    export default {
      install(Vue) {
        Vue.prototype.createNotice = (props) => createComponent(NoticeComponent, props)
      },
    
      success(props) {
        props = Object.assign({title: '提示'}, props)
    
        return createComponent(NoticeComponent, props)
      },
    
      fail(props) {
        props = Object.assign({title: '警告'}, props)
    
        return createComponent(NoticeComponent, props)
      }
    }
    
    3. 组件使用
      使用方式1:全局注册
    //mian.js 注册
    import Notice from '../packages/notice'
    
    Vue.use(Notice)
    
    //任意组件页面使用
    this.createNotice({
            title: '提示',
            content: '服务器错误',
            duration: 5000
          })
    

      使用方式2:快捷方式使用

    import Notice from '../packages/notice'
    Notice.fail({content: '服务器错误'})
    
    Notice.success({
        content: '操作成功',
        duration: 5000
       })
    

     

    没有了!!!

     
      
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 黑色星期五
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 比赛安排
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 斜率计算
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    Java实现 蓝桥杯VIP 算法训练 整数平均值
    控件动态产生器(使用RegisterClasses提前进行注册)
    Delphi编写自定义控件以及接口的使用(做了一个TpgDbEdit)
    Log4delphi使用心得
  • 原文地址:https://www.cnblogs.com/heshuaiblog/p/13187000.html
Copyright © 2011-2022 走看看