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 相关文章推荐
如何在一个页面显示多个百度地图
Apr 07 Javascript
jquery高效反选具体实现
May 05 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
ajax接收后台数据在html页面显示
Feb 19 Javascript
JS判断非空至少输入两个字符的简单实现方法
Jun 23 Javascript
Vue的elementUI实现自定义主题方法
Feb 23 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
axios对请求各种异常情况处理的封装方法
Sep 25 Javascript
深入理解js A*寻路算法原理与具体实现过程
Dec 13 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 Javascript
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
利用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 spl_autoload_register实现自动加载研究
2011/12/06 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
2014过年倒计时示例
2014/01/31 PHP
分享PHP守护进程类
2015/12/30 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
JS实现小星星特效
2019/12/24 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python字符转换
2008/09/06 Python
python 随机数生成的代码的详细分析
2011/05/15 Python
python 容器总结整理
2017/04/04 Python
python简单实现操作Mysql数据库
2018/01/29 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
毕业生的求职信范文分享
2013/12/04 职场文书
广告业务员岗位职责
2014/02/06 职场文书
党员承诺书格式
2014/05/21 职场文书
学校社会实践活动总结
2014/07/03 职场文书
店面出租协议书范本
2014/11/28 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android