最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • elementui预览图片组件二次封装

    正文概述 掘金(LastStarDust)   2020-12-29   813

    起因

    在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预览图片组件二次封装

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元