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编程起步(第六课)
Jan 10 Javascript
js对象数组按属性快速排序
Jan 31 Javascript
script的async属性以非阻塞的模式加载脚本
Jan 15 Javascript
document.getElementById获取控件对象为空的解决方法
Nov 20 Javascript
jQuery事件委托之Safari
Jul 05 Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 Javascript
canvas压缩图片转换成base64格式输出文件流
Mar 09 Javascript
详解angular笔记路由之angular-router
Sep 12 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
Aug 29 Javascript
小程序组件之仿微信通讯录的实现代码
Sep 12 Javascript
Vue中 axios delete请求参数操作
Aug 25 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通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
Python面向对象类继承和组合实例分析
2018/05/28 Python
基于python实现学生管理系统
2018/10/17 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
几个常见的软件测试问题
2016/09/07 面试题
大学生毕业求职找工作的自我评价
2013/09/29 职场文书
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
中学生校园广播稿
2014/01/16 职场文书
小加工厂管理制度
2014/01/21 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
公证委托书大全
2014/04/04 职场文书
新书发布会策划方案
2014/06/09 职场文书
Python实现天气查询软件
2021/06/07 Python
Django Paginator分页器的使用示例
2021/06/23 Python
JS轻量级函数式编程实现XDM三
2022/06/16 Javascript
Nginx开源可视化配置工具NginxConfig使用教程
2022/06/21 Servers