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 相关文章推荐
修复ie8&amp;chrome下window的resize事件多次执行
Oct 20 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
javascript使用avalon绑定实现checkbox全选
May 06 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
Nov 24 Javascript
不得不看之JavaScript构造函数及new运算符
Aug 21 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
Aug 25 Javascript
详解Vue项目中出现Loading chunk {n} failed问题的解决方法
Sep 14 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
vuex管理状态 刷新页面保持不被清空的解决方案
Nov 11 Javascript
vue页面加载时的进度条功能(实例代码)
Jan 13 Javascript
使用jQuery实现购物车
Oct 29 jQuery
利用JS判断元素是否为数组的方法示例
Jan 08 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
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
JavaScript对象反射用法实例
2015/04/17 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
js面向对象方式实现拖拽效果
2021/03/03 Javascript
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
使用Pyhton 分析酒店针孔摄像头
2020/03/04 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
工作迟到检讨书
2014/02/21 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
工程部岗位职责
2015/02/10 职场文书
个人党性锻炼总结
2015/03/05 职场文书
学校计划生育责任书
2015/05/09 职场文书
导游词之安徽九华山
2019/09/18 职场文书
Python并发编程实例教程之线程的玩法
2021/06/20 Python
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript