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 相关文章推荐
niceTitle 基于jquery的超链接提示插件
May 31 Javascript
jquery实现居中弹出层代码
Aug 25 Javascript
克隆javascript对象的三个方法小结
Jan 12 Javascript
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
通过location.replace禁止浏览器后退防止重复提交
Sep 04 Javascript
仿JQuery输写高效JSLite代码的一些技巧
Jan 13 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
深入对Vue.js $watch方法的理解
Mar 20 Javascript
bootstrap轮播图示例代码分享
May 17 Javascript
angular1.x ui-route传参的三种写法小结
Aug 31 Javascript
LayUI数据接口返回实体封装的例子
Sep 12 Javascript
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 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 文件扩展名 获取函数
2009/06/03 PHP
php调用mysql数据 dbclass类
2011/05/07 PHP
php中使用redis队列操作实例代码
2013/02/07 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
jquery 无限级联菜单案例分享
2013/03/26 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
常用jQuery代码分享
2015/07/14 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
18个非常棒的jQuery代码片段
2015/11/02 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
用npm-run实现自动化任务的方法示例
2019/01/14 Javascript
javascript如何实现create方法
2019/11/04 Javascript
八大排序算法的Python实现
2021/01/28 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
档案检查欢迎词
2014/01/13 职场文书
奥利奥广告词
2014/03/20 职场文书
买卖合同协议书范本
2014/10/18 职场文书
灵山大佛导游词
2015/02/04 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
Django如何与Ajax交互
2021/04/29 Python
Python基础之tkinter图形化界面学习
2021/04/29 Python
详解python字符串驻留技术
2021/05/21 Python