VUE组件中的 Drawer 抽屉实现代码


Posted in Javascript onAugust 06, 2019

因为项目中用的是 element-ui 框架,而这个框架并没有抽屉组件,所以自己实现一个,具体代码如下:

drawer.vue

<template>
 <div class="drawer">
  <div :class="maskClass" @click="closeByMask"></div>
  <div :class="mainClass" :style="mainStyle" class="main">
   <div class="drawer-head">
    <span>{{ title }}</span>
    <span class="close-btn" v-show="closable" @click="closeByButton">X</span>
   </div>
   <div class="drawer-body">
    <slot/>
   </div>
  </div>
 </div>
</template>
<script>
export default {
 props: {
  // 是否打开
  display: {
   type: Boolean
  },
  // 标题
  title: {
   type: String,
   default: '标题'
  },
  // 是否显示关闭按钮
  closable: {
   type: Boolean,
   default: true
  },
  // 是否显示遮罩
  mask: {
   type: Boolean,
   default: true
  },
  // 是否点击遮罩关闭
  maskClosable: {
   type: Boolean,
   default: true
  },
  // 宽度
  width: {
   type: String,
   default: '400px'
  },
  // 是否在父级元素中打开
  inner: {
   type: Boolean,
   default: false
  }
 },
 computed: {
  maskClass: function () {
   return {
    'mask-show': (this.mask && this.display),
    'mask-hide': !(this.mask && this.display),
    'inner': this.inner
   }
  },
  mainClass: function () {
   return {
    'main-show': this.display,
    'main-hide': !this.display,
    'inner': this.inner
   }
  },
  mainStyle: function () {
   return {
    width: this.width,
    right: this.display ? '0' : `-${this.width}`,
    borderLeft: this.mask ? 'none' : '1px solid #eee'
   }
  }
 },
 mounted () {
  if (this.inner) {
   let box = this.$el.parentNode
   box.style.position = 'relative'
  }
 },
 methods: {
  closeByMask () {
   this.maskClosable && this.$emit('update:display', false)
  },
  closeByButton () {
   this.$emit('update:display', false)
  }
 }
}
</script>
<style lang="scss" scoped>
.drawer {
 /* 遮罩 */
 .mask-show {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 10;
  background-color: rgba(0,0,0,.5);
  opacity: 1;
  transition: opacity .5s;
 }
 .mask-hide {
  opacity: 0;
  transition: opacity .5s;
 }
 /* 滑块 */
 .main {
  position: fixed;
  z-index: 10;
  top: 0;
  height: 100%;
  background: #fff;
  transition: all 0.5s;
 }
 .main-show {
  opacity: 1;
 }
 .main-hide {
  opacity: 0;
 }
 /* 某个元素内部显示 */
 .inner {
  position: absolute;
 }
 /* 其他样式 */
 .drawer-head {
  display: flex;
  justify-content: space-between;
  height: 45px;
  line-height: 45px;
  padding: 0 15px;
  font-size: 14px;
  font-weight: bold;
  border-bottom: 1px solid #eee;
  .close-btn {
   display: inline-block;
   cursor: pointer;
   height: 100%;
   padding-left: 20px;
  }
 }
 .drawer-body {
  font-size: 14px;
  padding: 15px;
 }
}
</style>

组件具体使用如下:

<template>
  <div class="box">
    <el-button type="primary" @click="display = true">打开抽屉</el-button>
    <drawer title="我是一个抽屉组件" :display.sync="display" :inner="true" :width="drawerWidth" :mask="false">
      1. Hello, world!
      2. Do you like it?
    </drawer>
  </div>
</template>
<script>
import drawer from '@/components/drawer/drawer'
export default {
  components: { drawer },
  data () {
    return {
      display: false,
      drawerWidth: '500px'
    }    
  }
}
</script>

总结

以上所述是小编给大家介绍的VUE组件中的 Drawer 抽屉实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
js no-repeat写法 背景不重复
Mar 18 Javascript
杨氏矩阵查找的JS代码
Mar 21 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
jQuery插件imgAreaSelect基础讲解
May 26 jQuery
JavaScript实现简单的双色球(实例讲解)
Jul 31 Javascript
Javascript获取某个月的天数
May 30 Javascript
微信小程序修改swiper默认指示器样式的实例代码
Jul 18 Javascript
小程序云开发初探(小结)
Oct 24 Javascript
layui清空,重置表单数据的实例
Sep 12 Javascript
浅入深出Vue之自动化路由
Aug 06 #Javascript
解决vue单页面修改样式无法覆盖问题
Aug 05 #Javascript
微信小程序3种位置API的使用方法详解
Aug 05 #Javascript
微信小程序 高德地图路线规划实现过程详解
Aug 05 #Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 #Javascript
使用apifm-wxapi模块中的问题及解决方法
Aug 05 #Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 #Javascript
You might like
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
2016/05/13 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
基于Vue 实现一个中规中矩loading组件
2019/04/03 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
python批量生成本地ip地址的方法
2015/03/23 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
tensorflow实现简单逻辑回归
2018/09/07 Python
解决Pycharm出现的部分快捷键无效问题
2018/10/22 Python
python七夕浪漫表白源码
2019/04/05 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
军训自我鉴定200字
2014/02/13 职场文书
家具促销活动方案
2014/02/16 职场文书
工伤赔偿协议书
2014/04/15 职场文书
高中综合实践活动总结
2014/07/07 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
党校党性分析材料
2014/12/19 职场文书
质检员岗位职责
2015/02/03 职场文书
三八节祝酒词
2015/08/11 职场文书
python垃圾回收机制原理分析
2022/04/13 Python