如何解决v-viewer和vue-lazyload组件冲突的问题

734 阅读1分钟

前言

项目里之前一直有用v-viewer组件来做图片的预览,但是最近需求变动需要加载大量图片,那肯定要做图片懒加载,然后就使用了vue-lazyload组件。

    //版本
     "vue-lazyload": "^1.3.3",
     "v-viewer": "^1.5.1"

出现的问题

图片懒加载没有问题,但是点击图片预览不了了,也没有任何报错。(不报错就很头疼啊!)

           <viewer  @inited="inited" :images="list[value]" >
              <img
                v-lazy="item.src"
                v-for="(item, index) in list[value]"
                :key="item.id"
              />
            </viewer>

怎么解决

因为没有一点报错信息,所以只能去慢慢摸索。

我们可以先对比使用v-lazy前后有viewer实例什么区别。监听inited事件来获取viewer实例。

使用v-lazy前

image.png

使用v-lazy后

image.png

可以看到使用后viewer实例上images是空的,length=0。我猜这个是因为在初始页面的时候,由于v-lazy的图片懒加载的影响,在对图片进行预览时监听的时候img的dom还没加载,导致监听失败,从而无法预览。

那可不可以自己手动给images和length添加值呢?

images里保存的是img的node节点,length自然就是img的长度。

直接上代码

    inited(viewer) {
        //viewer.element是img外层盒子的node节点,可以通过childNodes来获取img节点,并且把并且把获取到的nodeList变为数组,否则报错。
        //这里最好是去过滤一下是不是img节点,如果添加进去非img节点预览时也回报错。
        //如果你的页面层级比较深的话就得递归去遍历了
        viewer.images = [...viewer.element.childNodes].filter(item=>item.nodeName == 'IMG')
        
        //length也必须加上,  光加images是不行的。
        viewer.length = viewer.images.length
    },

这样写了以后,竟然可以预览了,经过测试也没有问题,那这个冲突的问题也就解决了。