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 相关文章推荐
Node.js实战 建立简单的Web服务器
Mar 08 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
SeaJS入门教程系列之使用SeaJS(二)
Mar 03 Javascript
jQuery中 delegate使用的问题
Jul 03 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
Feb 03 Javascript
js拖拽功能实现代码解析
Nov 28 Javascript
jQuery基本筛选选择器实例代码
Feb 06 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
JS实现多物体运动的方法详解
Jan 23 Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 Javascript
JavaScript 处理树数据结构的方法示例
Jun 16 Javascript
vue在路由中验证token是否存在的简单实现
Nov 11 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写的小东西
2006/12/06 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php+js iframe实现上传头像界面无跳转
2014/04/29 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
js格式化时间小结
2014/11/03 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
JS实现密码框的显示密码和隐藏密码功能示例
2016/12/26 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
Python中的choice()方法使用详解
2015/05/15 Python
python__name__原理及用法详解
2019/11/02 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
优秀医生事迹材料
2014/02/12 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
讲党性心得体会
2014/09/03 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
史上最牛辞职信
2015/05/13 职场文书
python中sqllite插入numpy数组到数据库的实现方法
2021/06/21 Python
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android
一文搞懂Java中的注解和反射
2022/06/21 Java/Android