vue Mixin的妙用

今天遇到一个问题,element ui组件的图片预览功能有点不符合需求,我们希望显示的小图是通过阿里云路径拼接裁剪过后的,预览的大图才是原图,这样就导致预览有问题了,因为src的路径和preview-src-list路径不一致,因此不能预览当前图片,不管点击哪张图片,总是从头开始。例子如下

<div class="demo-image__preview"> 
    <el-image
        style="width: 100px; height: 100px"
        :src="url"
        :preview-src-list="srcList"> 
    </el-image> 
</div> 
<script> 
export default { 
    data() { 
        return { 
            url: 'https://fuss10.elemecdn.com/1.jpeg?width=100&height=100', 
            srcList: [ 
                'https://fuss10.elemecdn.com/1.jpeg', 
                'https://fuss10.elemecdn.com/2.jpeg' 
            ] 
        }
    }
} 
</script>

看了element ui image组件源码,发现只需要修改其中的一个computed的方法就可以了。element ui中实现预览哪个图片的逻辑代码如下

imageIndex() {
    let previewIndex = 0;
    const srcIndex = this.previewSrcList.indexOf(this.src);
    if (srcIndex >= 0) {
      previewIndex = srcIndex;
    }
    return previewIndex;
}

从代码中可以看出,预览的索引是通过src在previewSrcList中过滤的,那么只要把阿里云拼接的图片从?后剪切,取前面再过滤就可以了,因此只要加入这段代码就可以了

const srcIndex = this.previewSrcList.indexOf(this.src.split("?")[0]);

那么问题来了,直接修改源码恐怕是有很大问题的,比如新的员工来到,让他克隆代码,重新安装包,总不会还要重新改写包的源码吧!更不可能这么点功能去element ui提pr吧!而且就算element ui可以,我们项目也等不及呀!仔细思考,发现这个问题,常常存在于项目之中,就是第三方组件有的时候不符合我们的项目需求,但又不想弃用第三方组件,那么有什么好办法呢?

解决方法:

vue为我们提供了很强的扩展性,甚至复写别人的方法,这个时候Mixin有了很好的发挥,我们可以把一个第三方组件当成一个Mixin,然后我们复写第三方组件,这样既不用修改第三方组件的源码,也能实现我们自己的功能。如何实现,其实vue的每个组件文件都是可以作为一个Mixin的。实现如下

import { Image } from "element-ui";
export default {
  name: "PreviewImage",
  mixins: [Image],
  computed: {
    imageIndex() {
      let previewIndex = 0;
      const srcIndex = this.previewSrcList.indexOf(this.src.split("?")[0]);
      if (srcIndex >= 0) {
        previewIndex = srcIndex;
      }
      return previewIndex;
    }
  }
};

当然这只是复写,还要把复写完的组件重新注册到全局,这样既保持了第三方全部的功能,也实现了我们自己的需求,注册方法如下

// 文件路径@/components/index.js
import Vue from "vue";
import PreviewImage from "@/components/PreviewImage";

Vue.use({
  install(Vue) {
    Vue.component(PreviewImage.name, PreviewImage);
  }
});

最后在main.js中引入即可

import "@/components";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值