zoukankan      html  css  js  c++  java
  • Vue使用Promise自定义confirm确认框组件

    使用Promise模拟浏览器确认框,可自定义标题,内容,按钮文字和类型

    参数名 类型 说明
    title String 标题
    content String 内容
    yesBtnText String 确认按钮文字,默认‘确定’
    cancelBtnText String 取消按钮文字,默认‘取消’
    type String info/success/warning/error,默认‘’

    Confirm.vue

    <template>
      <transition name="fade">
      <div class="confirm-wrap" v-if="visible">
        <div class="confirm">
          <div class="hd">
            {{title}}
            <i class="btn-close iconfont icon-close" @click="handleAction('close')"></i>
          </div>
          <div class="bd">
            <i v-if="type!=''" class="icon-type iconfont" :class="'icon-'+type"></i>{{content}}
          </div>
          <div class="ft">
            <a href="javscript:void(0)" class="btn btn-primary" @click="handleAction('yes')">{{yesBtnText}}</a>
            <a href="javscript:void(0)" class="btn btn-default" @click="handleAction('cancel')">{{cancelBtnText}}</a>
          </div>
        </div>
        <div class="backdrop" @click="handleAction('close')"></div>
      </div>
      </transition>
    </template>
    
    <script>
      export default {
        name: "MyConfirm",
        data() {
          return {
            visible:false,
            title:'',
            content:'',
            yesBtnText:'确定',
            cancelBtnText:'取消',
            type:'',
            promiseStatus:null,
          }
        },
        watch:{
          visible:function(curVal) {
            if(curVal&&document.body.scrollHeight > window.innerHeight){
              $('body').addClass('backdrop-open');
            }else{
              $('body').removeClass('backdrop-open');
            }
          }
        },
        methods: {
          confirm() {
            let _this = this;
            this.visible = true;
            return new Promise(function (resolve, reject) {
              _this.promiseStatus = {resolve, reject};
            });
          },
          handleAction(action){
            this.visible=false;
            if(action=='yes'){
              this.promiseStatus && this.promiseStatus.resolve();
            }else{
              this.promiseStatus && this.promiseStatus.reject();
            }
          }
        }
      }
    </script>
    

    index.js

    import Vue from 'vue'
    import Confirm from './Confirm.vue'
    
    const ConfirmBox = Vue.extend(Confirm);
    
    Confirm.install = (content, title, options) => {
      if (typeof title === 'object') {
        options = title;
        title = '';
      } else if (title === undefined) {
        title = '';
      }
    
      options = Object.assign({
        title: title,
        content: content,
      }, options);
    
      let instance = new ConfirmBox({
        data: options
      }).$mount();
    
      document.body.appendChild(instance.$el);
    
      return instance.confirm();
    };
    
    export default Confirm

    main.js

    import Confirm from '@/components/common/Confirm'
    Vue.prototype.$my_confirm = Confirm.install;

    页面调用

    show(){
        this.$my_confirm('是否登录?',{
            yesBtnText:'登录',
        }).then(() => {
            //点登录
        }).catch(() => {
            //点取消
        });
    },
    show1(){
        this.$my_confirm('此操作将永久删除该文件, 是否继续?','提示',{
            yesBtnText:'是',
            cancelBtnText:'否',
            type: 'warning'
        }).then(() => {
            //点是
        }).catch(() => {
            //点否
        });
    },

    效果图:

  • 相关阅读:
    [转载] 美团-云鹏: 写给工程师的十条精进原则
    Docker测试一个静态网站
    Docker容器访问外部世界
    Docker容器间通信
    Docker网络(host、bridge、none)详细介绍
    Docker的资源限制(内存、CPU、IO)详细篇
    esxi中CentOS7不停机加磁盘并扩容现有分区
    ESXI6.5安装CentOS7教程
    Linux查看占用CPU和内存的 的程序
    Centos7使用脚本搭建LVS的DR模式。
  • 原文地址:https://www.cnblogs.com/conglvse/p/9667647.html
Copyright © 2011-2022 走看看