• 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
       })
    

     

    没有了!!!

     
      
  • 相关阅读:
    UITextView in iOS7 doesn&#39;t scroll
    interlliJ idea 不识别文件类型的解决方式
    __super
    自用广告过滤规则,整合xwhyc大大的,非常小才79K
    Eclipse设置打印线
    SQL Server批量替换全部表中内容sql语句-清楚挂马
    删除同样元素(线性表)
    学习node js 之微信公众帐号接口开发 准备工作之三
    Bitmap基本概念及在Android4.4系统上使用BitmapFactory的注意事项
    多个rs485设备怎样跟上位机通讯?
  • 原文地址:https://www.cnblogs.com/heshuaiblog/p/13187000.html
Copyright © 2020-2023  润新知