今天来说下对elementui的el-dialog对话框进行二次封装。那我为什么要进行封装呢?
我来说一下:我们平常在写一个项目的时候,需要用到弹框非常多,如果我们每个页面写一次,会显得代码很累赘,那么对他们进行封装,就减少了代码的复用性。

先看一下效果

在这里插入图片描述
最终的效果就是上面的图片

下面上代码并解释

我一般都是使用的vue父传子props

**** 如果对vue的基础不太好的,可以参考:关于组件传值的讲解

这个页面是子组件

<template>
  <!-- 封装弹框 -->
  <div class="popup">
    <el-dialog
      :title="dialogTitle"
      :visible.sync="dialogVisible"
      :width="popupWidth"
      :before-close="handleClose"
    >
      <slot>
        <p>弹框自定义的内容</p>
      </slot>
      <span slot="footer" class="dialog-footer">
        <el-button @click="Cancel">取 消</el-button>
        <el-button type="primary" @click="Save">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  props: {
    dialogTitle: {
      type: String,
      default: '标题'
    },
    visible: {
      type: Boolean,
      default: false
    },
    popupWidth: {
      type: String,
      default: '550px'
    }
  },
  computed: {
    dialogVisible: {
      get () {
        return this.visible
      },
      set (val) {
        // 当visible改变的时候,触发父组件的 updateVisible方法,在该方法中更改传入子组件的 centerDialogVisible的值
        this.$emit('updateVisible', val)
      }
    }
  },
  methods: {
    Cancel () {
      this.$emit('resetPopupData')
    },
    Save () {
      this.$emit('submitPopupData')
    },
    handleClose () {
      this.$emit('handleClose')
    }
  }
}
</script>

<style lang="less">
.popup {
  width: 550px;
  .el-dialog {
    z-index: 10000;
    background-color: #ffffff;
    box-shadow: 0px 0px 10px 0px rgba(17, 130, 251, 0.5);
    border-radius: 5px;
    margin-top: 10% !important;
  }
  .el-dialog__header {
    width: 100%;
    height: 40px;
    line-height: 38px;
    border-bottom: 1px solid #f6f7f9;
    box-sizing: border-box;
    padding: 0 20px;
    font-size: 16px;
  }
  .el-dialog__close.el-icon.el-icon-close {
    font-size: 20px;
    width: 17px;
    height: 17px;
  }
  .el-button.el-button--default {
    width: 88px;
    color: #1182fb;
    border: 1px solid #1182fb;
  }
  .el-button.el-button--primary {
    width: 88px;
  }
  .el-dialog__body {
    padding: 24px 32px;
    box-sizing: border-box;
  }
  .el-dialog__headerbtn {
    top: 4px;
  }
  .el-dialog__title {
    color: #3c4354;
    font-family: PingFangSC-Regular;
    font-size: 16px;
    line-height: 16px;
  }
  .el-dialog__footer {
    text-align: center;
  }
}
</style>

下面是在父组件中是这么使用的

分三步:

  • 首先要引入子组件的路径
import Popup from '../../../components/common/Popup'
  • 接着就是注册
components: {
    Popup
}
  • 页面使用
<Popup
      :dialogTitle="dialogTitle"
      :visible.sync="dialogVisible"
      @updateVisible="updateVisible"
      @resetPopupData="resetPopupData"
      @submitPopupData="submitPopupData"
      @handleClose="handleClose"
      :popupWidth="'550px'"
    >
      <div style="height:150px;font-size:16px;color:#3c4354;font-family:PingFangSC-Medium;">
        具体的内容
      </div>
</Popup>

	dialogVisible: false, // 弹框的出现与否
    dialogTitle: '通过', // 标题

	// 修改是否让页面显示与隐藏的事件
	updateVisible (val) {
      this.dialogVisible = val
    },
    // 点击取消的事件
    resetPopupData () {
      //  这里可重置数据
      this.dialogVisible = false
    },
    // 点击确定的按钮
    async submitPopupData () {
      this.dialogVisible = false
    },
    // 关闭弹框(头部的X)
    handleClose () {
      this.dialogVisible = false
    }

以上就是对elementui的对话框的二次封装。

如果有什么不足之处,还望指出,一起进步

Logo

前往低代码交流专区

更多推荐