封装dialog的组件(对elementui的el-dialog的二次封装)

今天来说下对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的对话框的二次封装。

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

封装el-dialog组件的目的是为了在多个地方重复使用弹窗功能。通过封装可以实现组件间的数据通信和逻辑复用。在具体的封装中,可以使用.sync修饰符来监听属性的变化并同步通知到父组件。如果不使用.sync修饰符,需要手动绑定一个方法来监听属性变化并手动更新组件。 在父组件中,可以使用以下代码来使用封装的card-dialog组件: <card-dialog :visible.sync="visible"></card-dialog> card-dialog组件内部的代码如下: <template> <div> <el-dialog title="开卡设置" :visible.sync="openCardDialog"> </el-dialog> </div> </template> <script> export default { props: { visible: { type: Boolean, default: false } }, computed: { openCardDialog: { get() { return this.visible }, set(val) { console.log(val) this.$emit('update:visible', val) } } } } </script> 在popup.vue文件中,也可以封装el-dialog组件,代码如下: <template> <div> <el-dialog :visible.sync="dialogVisible" width="70%"> <div class="center"> <p>my name is popup</p> </div> </el-dialog> </div> </template> <script> export default { props: { visible: { type: Boolean, default: false }, objectData: { type: Object, default: () => {} } }, computed: { dialogVisible: { get() { return this.visible }, set(val) { this.$emit('updateVisible', val) } } }, created() { console.log(this.objectData) } } </script> 以上是关于封装el-dialog组件的示例代码,通过封装可以提高代码的复用性和可维护性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值