confirm弹窗确认插件

阅读: 7878    发布时间: 2018-09-05 15:01:31

github地址:https://github.com/501351981/vue_yii_cms

在后台弹窗确认也是一个常用的组件,比如在删除时,弹窗提醒用户确认,由于这部分经常使用,而且代码量也很小,所以也考虑做成插件的形式

QQ20180905-145208@2x.png

confirm组件比较简单,可能的数据属性有标题、内容、确定文字内容,确定后的回调函数、取消的文字内容、取消的回调、是否显示取消按钮

我们还是采取插件的形式开发

在src/components/plugins下创建confirm文件夹,然后创建两个文件,Confirm.vue 和index.js

confirm.vue

比较简单,看源码

<template>
  <transition name="fade">
   <div class="confirm" v-show="isShow">
     <div class="confirm-content">
       <div class="title">{{confirm.title}}</div>
       <div class="content">{{confirm.content}}</div>
       <div class="btn-area">
         <div class="btn btn-primary" @click="onOk">{{confirm.confirmText}}</div>
         <div class="btn btn-default" v-if="confirm.showCancel" @click="onCancle">{{confirm.cancelText}}</div>
       </div>
     </div>

   </div>
  </transition>

</template>
<script>
 export default {
    name:'Confirm',
 data:function () {
      return {
        confirm:{
          title:'提醒',
 content:'',
 confirmText:'确定',
 cancelText:'取消',
 showCancel:true,
 success:'',
 fail:''
 },
 isShow:false

 }
    },
 methods:{
      onOk:function () {
        if(typeof(this.confirm.success)=='function'){
          this.confirm.success()
        }
        this.isShow=false
 },
 onCancle:function () {
        if(typeof(this.confirm.fail)=='function'){
          this.confirm.fail()
        }
        this.isShow=false
 },
 show:function (opt) {
        this.confirm=opt
        this.isShow=true
 }
    }
  }

</script>

<style scoped lang="less">
 .confirm{
    position: fixed;
 width: 100%;
 height: 100%;
 left: 0;
 top:0;
 z-index: 9999;
 background-color: rgba(0,0,0,0.4);

 .confirm-content{
      width: 280px;
 box-sizing: border-box;
 background: white;
 position: absolute;
 left: 50%;
 top:50%;
 margin-left: -140px;
 margin-top: -80px;
 border-radius: 10px;
 text-align: center;
 }
    .title{
      font-size: 18px;
 color: black;
 padding-top: 25px;
 }
    .content{
      font-size: 15px;
 line-height: 18px;
 /*color: #999999;*/
 padding: 30px 20px;
 }
    .btn-area{
      width: 100%;
 height: 50px;
 line-height: 50px;
 border-top: 1px solid #eeeeee;
 display: flex;
 justify-content: center;
 align-items: center;
 .btn{
        margin-left: 10px;
 margin-right: 10px;
 border-radius: 0;
 }

    }
  }
</style>


index.js 

import vue from 'vue'
import confirmComponent from './Confirm.vue'

var Confirm={}

Confirm.install=function (vue) {
  let ConfirmConstructor = vue.extend(confirmComponent)
  let ConfirmDom=new ConfirmConstructor()
  let tpl=ConfirmDom.$mount().$el

  document.body.appendChild(tpl)

  vue.prototype.$confirm=function (options) {
    let opt={
      title:'提醒',
      content:'',
      confirmText:'确定',
      cancelText:'取消',
      showCancel:true,
      success:'',
      fail:''
    }

    Object.assign(opt,options)

    ConfirmDom.show(opt)

  }

}

export default Confirm

main.js

import confirmRegistry from './components/plugins/confirm/index'
Vue.use(confirmRegistry)

项目中使用

this.$confirm({
  content:"删除操作不能恢复,您确定要删除吗",

  success:function () {
    ... //点击确定按钮进行的处理
  },
  fail:function(){
    ... //点击取消按钮之后的处理 
  }
})


-END-