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 相关文章推荐
斜45度寻路实现函数
Aug 20 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
Jul 29 Javascript
jquery实现拖拽调整Div大小
Jan 30 Javascript
javascript中checkbox使用方法实例演示
Nov 19 Javascript
jQuery+PHP+MySQL实现无限级联下拉框效果
Feb 19 Javascript
使用 stylelint检查CSS_StyleLint
Apr 28 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
JavaScript实现职责链模式概述
Jan 25 Javascript
分享5个好用的javascript文件上传插件
Sep 16 Javascript
详解ES6 系列之异步处理实战
Oct 26 Javascript
深入了解响应式React Native Echarts组件
May 29 Javascript
原生js拖拽实现图形伸缩效果
Feb 10 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
关于时间计算的结总
2006/12/06 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
vue如何限制只能输入正负数及小数
2019/07/04 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
[05:15]2018年度CS GO社区贡献奖-完美盛典
2018/12/16 DOTA
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
python 字符串和整数的转换方法
2018/06/25 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
python线程join方法原理解析
2020/02/11 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
Python读写Excel表格的方法
2021/03/02 Python
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
出口公司经理求职简历中的自我评价
2013/10/13 职场文书
大学生就业自荐信
2013/10/26 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
2014村务公开实施方案
2014/02/25 职场文书
委托书怎样写
2014/08/30 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
郭明义电影观后感
2015/06/08 职场文书
导游词之杭州西湖
2019/09/19 职场文书
MongoDB balancer的使用详解
2021/04/30 MongoDB