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学习笔记5 类和对象
Jan 11 Javascript
jquery实现类似淘宝星星评分功能有截图
Sep 15 Javascript
asp知识整理笔记3(问答模式)
Sep 27 Javascript
js实现点击获取验证码倒计时效果
Jan 28 Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 Javascript
js实现简易垂直滚动条
Feb 22 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
May 10 Javascript
Node.js连接Sql Server 2008及数据层封装详解
Aug 27 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
jquery 验证用户名是否重复代码实例
May 14 jQuery
layui--select使用以及下拉框实现键盘选择的例子
Sep 24 Javascript
vue使用节流函数的踩坑实例指南
May 20 Vue.js
浅入深出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生成UTF8文件的方法
2010/05/15 PHP
php多个字符串替换成同一个的解决方法
2013/06/18 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
JQuery 文本框使用小结
2010/05/22 Javascript
jQuery前台数据获取实现代码
2011/03/16 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
vue组件生命周期详解
2017/11/07 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】
2020/05/12 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python中的作用域规则详解
2015/01/30 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
电子信息毕业生自荐信
2013/11/16 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
公司授权委托书范文
2014/09/21 职场文书
大学生创业事迹材料
2014/12/30 职场文书
《窃读记》教学反思
2016/02/18 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers