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 相关文章推荐
通过jquery还原含有rowspan、colspan的table的实现方法
Feb 10 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
jquery动态分页效果堪比时光网
Sep 25 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
Aug 24 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
CSS3 media queries结合jQuery实现响应式导航
Sep 30 Javascript
js实现炫酷的左右轮播图
Jan 18 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
node.js使用fs读取文件出错的解决方案
Oct 23 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
Feb 28 Javascript
ant design vue导航菜单与路由配置操作
Oct 28 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/04 星际争霸
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
JavaScript 继承使用分析
2011/05/12 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
jquery实现网站列表切换效果的2种方法
2016/08/12 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
Python中类型关系和继承关系实例详解
2015/05/25 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
科颜氏法国官网:Kiehl’s法国
2019/08/20 全球购物
如何选择使用结构还是类
2014/05/30 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
企业贷款委托书格式
2014/09/12 职场文书
2014年英语工作总结
2014/12/20 职场文书
浅谈自定义校验注解ConstraintValidator
2021/06/30 Java/Android
vue项目支付功能代码详解
2022/02/18 Vue.js