elementui实现预览图片组件二次封装


Posted in Javascript onDecember 29, 2020

起因

在elementui组件库中,el-image组件有个预览图片功能,比较简洁,但是和图片绑定在一起,我们只想要一个单纯的预览组件,传递一个图片,通过事件方式,显示大图

分析

通过查看elementui的代码,发现在image(el-image组件)目录中里面有一个image-viewer组件, el-image组件的预览功能也是通过这一个组件实现的,只是官方没有把这个组件单独暴露出来

elementui实现预览图片组件二次封装

这里就比较简单了,我们可以使用手动导入组件的方式,引入image-viewer组件

image-viewer组件二次封装

这里大概做了三件事

  • 组件方式导入element的image-viewer组件
  • 使用$attrs和$listeners把上层的属性和方法,原封不动传递给image-viewer组件,不用手动处理属性和方法,除非添加额外的功能
  • 修改关闭按钮的样式
<template>
 <div>
 <el-image-viewer
  v-bind="$attrs"
  v-on="$listeners"
 />
 </div>
</template>

<script>
// 手动导入图片预览组件
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'

export default {
 name: 'ImagePreview',
 components: { ElImageViewer }
}
</script>

<style lang="scss" scoped>
::v-deep .el-image-viewer__btn.el-image-viewer__close {
 color: #fff;
}
</style>

使用

<template>
 <div>
 <el-button type="primary" @click="handlePictureCardPreview"
  >大图预览</el-button
 >
 <image-preview
  v-if="dialogVisible"
  :on-close="
  () => {
   dialogVisible = false;
  }
  "
  :url-list="[dialogImageUrl]"
 />
 </div>
</template>

<script>
import ImagePreview from "@/components/ImagePreview";

export default {
 components: {
 ImagePreview,
 },
 data() {
 return {
  imageUrl:
  "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1483731740,4186543320&fm=26&gp=0.jpg",
  dialogImageUrl: "",
  dialogVisible: false,
 };
 },
 methods: {
 // 预览
 handlePictureCardPreview() {
  this.dialogImageUrl = this.imageUrl;
  this.dialogVisible = true;
 }
 },
};
</script>

优化:点击mask遮罩层关闭图片预览

上面封装以后,可以很简单使用图片预览,美中不足的是,点击遮罩层,无法关闭大图预览,只能点击右上角关闭按钮,才会关闭预览,使用上不太方便

分析

在查看image-viewer组件的源码发现,关闭按钮绑定hide方法,用于关闭预览的,但是遮罩层没有绑定任何方法,遮罩层也没有对外暴露任何方法调用,难受~

elementui实现预览图片组件二次封装

解决方法

  • 先获取image-viewer组件
  • 随后获取到遮罩层元素,给遮罩层绑定一个方法,点击时候,就调用image-viewer组件里的hdie方法,达到关闭的目的
  • 在卸载组件的时候,移除之前给遮罩层绑定的方法
  • 点击遮罩关闭预览,对外暴露一个标志,控制是否点击遮罩关闭预览

完整代码如下:

<template>
 <div>
 <el-image-viewer
  ref="elImageViewer"
  v-bind="$attrs"
  v-on="$listeners"
 />
 </div>
</template>

<script>
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'

export default {
 name: 'ImagePreview',
 components: { ElImageViewer },
 props: {
 // 点击mask是否隐藏大图
 maskhide: {
  type: Boolean,
  default: true
 }
 },
 mounted() {
 if (this.maskhide) {
  this.addHideToMask()
 }
 },
 methods: {
 addHideToMask() {
  this.$viewer = this.$refs.elImageViewer
  if (this.$viewer) {
  // 获取遮罩层元素
  const mask = this.$viewer.$el.querySelector('.el-image-viewer__mask')
  if (mask) {
   // 遮罩层增加点击事件,关闭预览
   mask.addEventListener('click', this.hide)
   // hook卸载事件,移除之前添加在mask元素的事件
   this.$once('hook:beforeMount', () => {
   mask && mask.removeEventListener('click', this.hide)
   })
  }
  }
 },
 hide() {
  this.$viewer && this.$viewer.hide()
 }
 }
}
</script>

<style lang="scss" scoped>
::v-deep .el-image-viewer__btn.el-image-viewer__close {
 color: #fff;
}
</style>

查看在线示例

查看在线示例

以上就是elementui实现预览图片组件二次封装的详细内容,更多关于elementui 预览图片组件二次封装的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
js判断上传文件类型判断FileUpload文件类型代码
May 20 Javascript
Javascript Memoizer浅析
Oct 16 Javascript
如何学JavaScript?前辈的经验之谈
Dec 28 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
May 07 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 Javascript
基于openlayers实现角度测量功能
Sep 28 Javascript
利用node.js开发cli的完整步骤
Dec 29 #Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
Dec 29 #Javascript
vue中配置scss全局变量的步骤
Dec 28 #Vue.js
为什么推荐使用JSX开发Vue3
Dec 28 #Vue.js
Vue仿百度搜索功能
Dec 28 #Vue.js
node.js通过Sequelize 连接MySQL的方法
Dec 28 #Javascript
解决elementui表格操作列自适应列宽
Dec 28 #Javascript
You might like
URL Rewrite的设置方法
2007/01/02 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
PHP PDO操作总结
2014/11/17 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
python 中文字符串的处理实现代码
2009/10/25 Python
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
简单上手Python中装饰器的使用
2015/07/12 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python实现二维有序数组查找的方法
2016/04/27 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
Python3 中把txt数据文件读入到矩阵中的方法
2018/04/27 Python
python实现复制文件到指定目录
2019/10/16 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
关于前端上传文件全面基础扫盲贴(入门)
2019/08/01 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
培训讲师邀请函
2014/01/10 职场文书
信用社员工先进事迹材料
2014/02/04 职场文书
学用政策心得体会
2014/09/10 职场文书
商标侵权律师函
2015/05/27 职场文书
详细介绍python类及类的用法
2021/05/31 Python