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 相关文章推荐
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 Javascript
js调试工具console.log()方法查看js代码的执行情况
Aug 08 Javascript
jQuery修改li下的样式以及li下的img的src的值的方法
Nov 02 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
Sep 01 Javascript
理解Javascript的call、apply
Dec 16 Javascript
jQuery formValidator表单验证
Jan 07 Javascript
JS创建事件的三种方法(实例代码)
May 12 Javascript
分享一个插件实现水珠自动下落效果
Jun 01 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
Node.js系列之发起get/post请求(2)
Aug 30 Javascript
jQuery实现轮播图效果demo
Jan 11 jQuery
Vue 组件复用多次自定义参数操作
Jul 27 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
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
PHP实现获取文件mime类型多种方法解析
2020/05/28 PHP
常用参考资料(手册)下载或者链接
2006/07/22 Javascript
Javascript里使用Dom操作Xml
2007/01/22 Javascript
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
Nodejs进阶:基于express+multer的文件上传实例
2016/11/21 NodeJs
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
浅谈react+es6+webpack的基础配置
2017/08/09 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
通过js给网页加上水印背景实例
2019/06/17 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
在Django的通用视图中处理Context的方法
2015/07/21 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
详解python3中的真值测试
2018/08/13 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
Python使用20行代码实现微信聊天机器人
2020/06/05 Python
python中return不返回值的问题解析
2020/07/22 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
CheapTickets香港机票预订网站:CheapTickets.hk
2019/06/26 全球购物
校园招聘策划书
2014/01/09 职场文书
活动总结书
2014/05/08 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
2014年物流工作总结
2014/11/25 职场文书
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang