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 getJSON()+.ashx 实现分页(改进版)
Mar 28 Javascript
JQuery中dataGrid设置行的高度示例代码
Jan 03 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
Three.js学习之Lamber材质和Phong材质
Aug 04 Javascript
Angularjs结合Bootstrap制作的一个TODO List
Aug 18 Javascript
JavaScript构建自己的对象示例
Nov 29 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
微信小程序之选项卡的实现方法
Sep 29 Javascript
Vue.js点击切换按钮改变内容的实例讲解
Aug 22 Javascript
vuex实现的简单购物车功能示例
Feb 13 Javascript
BootStrap前端框架使用方法详解
Feb 26 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中设置多级目录session的问题
2011/08/08 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
vue中使用v-model完成组件间的通信
2019/08/22 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Python之字典对象的几种创建方法
2020/09/30 Python
Perfumetrader荷兰:香水、化妆品和护肤品在线商店
2017/09/15 全球购物
巴西24小时在线药房:Droga Raia
2020/05/12 全球购物
几道PHP的面试题
2012/05/19 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
网络维护中文求职信
2014/01/03 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
个人工作能力自我评价
2015/03/05 职场文书
个人年终总结开头
2015/03/06 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
《给予树》教学反思
2016/03/03 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL
golang连接MySQl使用sqlx库
2022/04/14 Golang
Nginx报404错误的详细解决方法
2022/07/23 Servers