自定义vue组件

作者: majunchang | 来源:发表于2017-08-20 09:46 被阅读27次

    使用js的方式对弹框进行的扩展 使用介绍 (alert跟这个差不多 并且更加简易 不再赘述)

    弹框部分的引用

    
    this.$Dialog.modal({
    
    dialogClass: 'delModal-ma',
    
    header: "删除确认",
    
    body: `删除项目${this.projectName}后,会进入回收站,7天后彻底删除`,
    
    confirm: () => {
    
    this.$Dialog.hide('modal');
    
    // 如果需要 在你点击确定之后发生什么 在这里面添加ajax请求等
    
    },
    
    close: () => {
    
    this.$Dialog.hide('modal')
    
    },
    
    })
    
    

    显示效果

    mark

    html配置

    mark
    配置项 渲染结果
    header 弹框的头部提示语
    body 弹框的body部分 支持html格式
    dialogClass 弹框的类名 默认是dialogClass
    titleClass 弹框头部的类名 默认是titleClass
    primaryBtn 确定按钮的文案
    defaultBtn 取消按钮的文案
    dialog 控制弹框显示和隐藏的开关
    confirm 点击确按钮之后发生的行为
    close 点击取消按钮之后发生的行为

    配置源码

    import Vue from 'vue'
    
    let alertVm, modalVm;
    export default {
      alert: (options) => {
        if (!alertVm) {
          let container = document.createElement("div");
          container.setAttribute("class", "alert-component");
          document.body.appendChild(container)
          alertVm = new Vue({
            el: container,
            template: `<mu-dialog :open="dialog" :title="header" :titleClass='titleClass'  :dialogClass='dialogClass' >
          <div v-html='body' class='muse-ui-alertBody'></div>
        <mu-flat-button :label="primaryBtn" slot="actions" primary @click="confirm"/>
      </mu-dialog>`,
            data () {
              return {
                timer: '',
                hidden: true,
                dialogClass: 'alertClass',
                titleClass: 'titleClass',
                header: '提示',
                body: '',
                footer: '',
                primaryBtn: '确定',
                dialog: true,
                confirm: () => {
                  this.hide();
                },
              }
            },
            methods: {
              show (options) {
                console.log('show');
                if (!options) options = {};
                if (typeof options === 'string') {
                  this.body = options
                } else {
                  this.dialog = true;
                  this.dialogClass = options.dialogClass ? options.dialogClass : 'sindialogClass';
                  this.titleClass = options.titleClass ? options.titleClass : 'titleClass';
                  this.header = options.header ? options.header : '提示';
                  this.body = options.body ? options.body : '';
                  this.footer = options.footer ? options.footer : '';
                  this.primaryBtn = options.primaryBtn ? options.primaryBtn : '确定';
                  options.confirm ? this.confirm = options.confirm : false;
                }
                var headerClass = this.titleClass;
                $('.headerClass').html('<h1>这是一个演习</h1>');
                // this.timer = setTimeout(() => {
                //   clearTimeout(this.timer);
                //   this.body = options.body;
                //   this.dialog = false;
                //   this.timer = setTimeout(() => {
                //     this.hide()
                //   }, time)
                // }, 4000)
              },
              hide () {
                this.dialog = false;
              }
            },
            mounted(){
              if(navigator.userAgent.indexOf('Firefox')>=0){
                this.dialogClass += ' '+ 'fireFpox-mudialog';
              }
            }
          })
          $(document).on('click', function (e) {
            if (alertVm.hidden === false) {
              if ($.contains(alertVm.$el, e.target) || alertVm.$el === e.target) {
                return false;
              }
              alertVm.hide();
            }
          })
        }
        alertVm.show(options)
      },
      modal: options => {
        if (!modalVm) {
          let container = document.createElement("div");
          container.setAttribute("class", "muse-dialog");
          document.body.appendChild(container)
          modalVm = new Vue({
            el: container,
            template: `<mu-dialog :open="dialog" :title="header" :titleClass='titleClass' :dialogClass='dialogClass' @close="close">
        <div v-html='body' class='muse-ui-body'></div>
          <mu-flat-button slot="actions" @click="close" primary :label="defaultBtn"/>
          <mu-flat-button slot="actions" primary @click="confirm" :label="primaryBtn"/>
      </mu-dialog>
    `,
            data () {
              return {
                header: `提示`,
                headerDiv: '',
                dialogClass: 'dialogClass',
                titleClass: 'titleClass',
                body: '',
                footer: '',
                primaryBtn: '确定',
                defaultBtn: '取消',
                dialog: true,
                confirm: () => {
                  this.hide();
                },
                close: () => {
                  this.hide()
                },
              }
            },
            methods: {
              show (options) {
                console.log('show');
                if (!options) options = {};
                if (typeof options === 'string') {
                  this.body = options
                } else {
                  this.dialog = true;
                  this.dialogClass = options.dialogClass ? options.dialogClass : 'sindialogClass';
                  this.titleClass = options.titleClass ? options.titleClass : 'tittleClass';
                  this.header = options.header ? options.header : '提示';
                  this.headerDiv = options.headerDiv ? options.headerDiv : 'majunchang';
                  this.body = options.body ? options.body : '';
                  this.footer = options.footer ? options.footer : '';
                  this.primaryBtn = options.primaryBtn ? options.primaryBtn : '确定';
                  this.defaultBtn = options.defaultBtn ? options.defaultBtn : '取消';
                  options.confirm ? this.confirm = options.confirm : false;
                  options.close ? this.close = options.close : false;
                }
                var headerClass = this.titleClass;
                $('.headerClass').html('<h1>这是一个演习</h1>');
              },
              hide () {
                this.dialog = false;
              }
            },
            mounted(){
              this.dialog = true;
                if(navigator.userAgent.indexOf('Firefox')>=0){
                  this.dialogClass += ' '+ 'fireFpox-mudialog';
                }
            },
          })
        }
    
        modalVm.show(options)
        Vue.nextTick(function () {
          if (options.callback) {
            options.callback();
          }
        })
      },
      hide: (e) => {
        console.log(e);
        if (!e || e === 'modal') {
          modalVm.hide();
        } else if (e === 'alert') {
          alertVm.hide();
        }
      }
    }
    
    

    相关文章

      网友评论

        本文标题:自定义vue组件

        本文链接:https://www.haomeiwen.com/subject/cxxfdxtx.html