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 Ajax异步处理Json数据详解
Nov 05 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
Jan 26 Javascript
JavaScript中消除闭包的一般方法介绍
Mar 16 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
jQuery防止重复绑定事件的解决方法
May 14 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
Aug 29 Javascript
Angular.Js之Scope作用域的学习教程
Apr 27 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
Aug 08 jQuery
angular写一个列表的选择全选交互组件的示例
Jan 22 Javascript
微信小程序新手教程之启动页的重要性
Mar 03 Javascript
详解微信小程序开发之formId使用(模板消息)
Aug 27 Javascript
viewer.js实现图片预览功能
Jun 24 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
php实现的简单压缩英文字符串的代码
2008/04/24 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
Ajax+PHP实现的分类列表框功能示例
2019/02/11 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
Javascript es7中比较实用的两个方法示例
2017/07/21 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
Python ldap实现登录实例代码
2016/09/30 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Django框架视图函数设计示例
2019/07/29 Python
python cv2在验证码识别中应用实例解析
2019/12/25 Python
Python 去除字符串中指定字符串
2020/03/05 Python
PyTorch的torch.cat用法
2020/06/28 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
什么是makefile? 如何编写makefile?
2012/08/08 面试题
小学教师事迹材料
2014/01/13 职场文书
致垒球运动员加油稿
2014/02/16 职场文书
教师求职信范文
2014/05/24 职场文书
辣妈辣妹观后感
2015/06/10 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书
PHP中->和=>的意思
2021/03/31 PHP
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL