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 相关文章推荐
超强的IE背景图片闪烁(抖动)的解决办法
Sep 09 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
Node.js实用代码段之获取Buffer对象字节长度
Mar 17 Javascript
thinkjs之页面跳转同步异步操作
Feb 05 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
利用Webpack实现小程序多项目管理的方法
Feb 25 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
Jul 31 Javascript
基于vue中的scoped坑点解说
Sep 04 Javascript
五句话帮你轻松搞定js原型链
Dec 09 Javascript
JS实现点击掉落特效
Jan 29 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
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
jquery radio 操作代码
2011/03/16 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
[04:29]2014DOTA2国际邀请赛 主赛事第三日TOPPLAY
2014/07/21 DOTA
Python continue语句用法实例
2014/03/11 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
2016/07/02 Python
Python 在字符串中加入变量的实例讲解
2018/05/02 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
大学四年个人的自我评价
2014/02/26 职场文书
防火标语大全
2014/10/06 职场文书
高中校园广播稿
2014/10/21 职场文书
单位介绍信格式
2015/01/31 职场文书
2015年仓库工作总结
2015/04/09 职场文书
班主任寄语2016
2015/12/04 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android