el-dialog组件的二次封装

一、背景

element-ui组件的样式是固定的,比如我们常用的那些组件,table,button,icon,tab等等。当我们需要的样式和element组件有偏差的时候,我们可以通过针对element组件进行二次封装,然后通过Vue.component()方法,定义到全局,来解决我们当前的项目需求

二、 分析

(1)有利于紧密贴合业务,提高开发效率
(2)封装的组件越来越多,业务能得到实际的解决,并能形成公司独特组件库
(3)提高开发者组件设计能力
(4)需要长期维护,当官方库最初更新尤其是对封装组件影响较大时,需要对应更新,维护成本较大

三、示例封装el-dialog

  1. 不能简单的进行el-组件写在封装组件内,在进行调用是不会生效,相当于父组件再引用的时候直接展示了组件,需要加标签,这个element组件库文档说明中是有预留api的,例如el-dialog中:
    使用时,要注意slot结构,
     <slot name="title" />
     <slot />
     <span slot="footer" class="dialog-footer">
       <slot name="footer" />
     </span>
  1. 子组件在封装的时候,主要是将原本封装好的属性 再次重新罗列,如果需求只是用一部分功能 只需要把基本功能都加上即可,但是对于高复用的组件来说,就需要把el-dialog的所有属性都进行罗列,其中,值得注意的是对话框有一个右上角关闭功能,这个按钮功能主要起到可直接关闭当前对话框以及遮罩层功能,对于封装组件来说控制对话框的显示隐藏是通过属性:visible来实现的,但是对于封装组件是通过调用组件方:父组件通过props传递,props是一种单向数据传递方式,故不能通过改变visible值为false来进行关闭弹窗,饿了么团队使用了一种语法糖方法来进行是实现
<el-dialog
      id="kydialog"
      :show="show"
      :title="title"
      :visible.sync="visible"
      :width="width"
      :modal="false"
      :fullscreen="fullscreen"
      :top="top"
      :append-to-body="appendToBody"
      :lock-scroll="lockScroll"
      :custom-class="customClass"
      :close-on-click-modal="closeOnClickModal"
      :close-on-press-escape="closeOnPressEscape"
      :show-close="showClose"
      :before-close="beforeClose"
      :center="center"
      :destroy-on-close="destroyOnClose"
      :inner-dialog="innerDialog"
      @open="open"
      @opened="opened"
      @close="close"
      @closed="closed"
      @shadeShow="shadeShow"
      @clearShade="clearShade"
    >
      <slot />
      <span slot="footer" class="dialog-footer">
        <slot name="footer" />
      </span>
    </el-dialog>

其中visible属性较为特殊,需要加上sync修饰符,element官方给的写法也是如此,visible.sync,但是当二次封装的时候,在是父组件调用二次封装的组件使用visible时,点击右上角的“×”会造成无法关闭,源码中实现利用的是sync语法糖来实现改变父组件传来的visible值,来实现关闭对话框,如果直接关闭也可再二次封装组件中添加close方法 ,将关闭控制值,放到close中去,而下面的调用方法,是将语法糖直接写在二次封装的组件中,这样,对于使用方的父组件来说,更少的修改,用户体验较好

export default {
  props: {
    show: { type: Boolean, default: false }
  },
  data() {
    return {
      visible: this.show
    }
  },
  watch: {
    show: {
      immediate: true,
      handler(show) {
        this.visible = this.show
      }
    }
  },
  methods: {
    OnClose() {
      this.$emit('update:show', false)
    }
  }
}
  1. 当使用el-dialog对话框自定义头部信息时,如果直接使用上述封装的组件,会发现自定义头部消失,这是因为自定义头部内容相当于覆盖已经封装的组件头部,但是由于二次封装就已经将el-dialog的头部进行覆盖封装了,所以想在已经覆盖封装的组件头部内容上在进行自定义封装,显然是无效的,解决方法,只需加一个属性来进行判断,来控制对话框头部是否是二次封装的slot,来实现,封装中结构(控制属性定义为custom-header)
  <div v-if="customHeader" slot="title">
        <slot name="title" />
     </div>
     <slot v-else name="title" />
     <slot />
     <span slot="footer" class="dialog-footer">
        <slot name="footer" />
     </span>
  1. 这样在使用对话框自定义头部时只需要加上custom-header为true的属性即可,
    父组件使用
<template>
    <kj-dialog
      title="提示"
      :show.sync="dialogVisible"
      width="30%"
      center
    >
      <div slot="title" class="header-title">
        <span style="line-height:24px;font-size:18px;color:red;">你好</span>
      </div>
      <span>需要注意的是内容是默认不居中的</span>
      <span slot="footer" class="dialog-footer">
        <el-button @click="centerDialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
      </span>
    </kj-dialog>
</template>
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2 可以通过对 el-dialog 进行二次封装来满足自己的需求。一般来说,我们会在项目中封装一些基础组件,比如说对话框、表格、表单等等,这些组件封装可以使得我们在使用时更加方便快捷。 对于 el-dialog二次封装,一般需要注意以下几点: 1. 组件名和引入方式:在封装组件时,需要给组件起一个唯一的名字,避免和其他组件重名。同时,为了方便引入,可以将组件导出为一个单独的 js 文件,然后在需要使用的地方引入。 2. 组件属性:在封装组件时,需要考虑到使用者的需求,将一些常用的属性暴露出来,同时也可以自定义一些属性来更好地满足需求。 3. 插槽:el-dialog 中有一些插槽,比如 title、footer 等,我们需要将这些插槽暴露出来,方便使用者进行自定义。 下面是一个简单的 el-dialog 二次封装示例: ``` <template> <el-dialog :title="title" :visible.sync="visible" :width="width" :before-close="beforeClose" :close-on-press-escape="closeOnPressEscape" :lock-scroll="lockScroll" :custom-class="customClass" :close-on-click-modal="closeOnClickModal" :show-close="showClose" > <slot name="header"></slot> <slot></slot> <slot name="footer"></slot> </el-dialog> </template> <script> export default { name: 'MyDialog', props: { title: { type: String, default: '' }, visible: { type: Boolean, default: false }, width: { type: String, default: '50%' }, beforeClose: Function, closeOnPressEscape: { type: Boolean, default: true }, lockScroll: { type: Boolean, default: true }, customClass: { type: String, default: '' }, closeOnClickModal: { type: Boolean, default: true }, showClose: { type: Boolean, default: true } } } </script> ``` 在这个示例中,我们将 el-dialog 的一些常用属性暴露出来,同时将 header、content、footer 三个插槽暴露出来,方便使用者自定义。在使用时,只需要引入这个组件,然后像使用 el-dialog 一样使用即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值