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 相关文章推荐
用js实现预览待上传的本地图片
Mar 15 Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 Javascript
一个简单的js动画效果代码
Jul 20 Javascript
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
AngularJS  ng-table插件设置排序
Sep 21 Javascript
基于JavaScript实现带缩略图的轮播效果
Jan 12 Javascript
原生javascript实现分页效果
Apr 21 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
Nov 08 Javascript
Vue.js暴露方法给WebView的使用操作
Sep 07 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
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php 获取xml接口数据的处理方法
2018/05/31 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
基于Node.js实现nodemailer邮件发送
2016/01/26 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
原生JS仿QQ阅读点击展开、收起效果
2017/03/08 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
RequireJS用法简单示例
2018/08/20 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
python回调函数的使用方法
2014/01/23 Python
使用Python编写简单的端口扫描器的实例分享
2015/12/18 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
PyTorch实现更新部分网络,其他不更新
2019/12/31 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
介绍一下JNDI的基本概念
2013/07/26 面试题
事业单位公务员的职业生涯规划
2014/01/15 职场文书
生物技术专业求职信
2014/06/10 职场文书
小学安全工作总结2015
2015/05/18 职场文书
遗嘱格式范本
2015/08/07 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技