# 图片预览

# 技术点

swiper 路由 hash

# 介绍

图片预览有挺多插件,但未找到合适本项目的,本项目中需要功能:点击小图时,展示该小图对应的大图,并可左右滑动,切换上一张与下一张大图,最终选择使用 swiper 组件实现。

# 实现解析

点击小图时,显示由 swiper 封装的 photo-swiper 组件,同时路由地址后缀增加 #preview?index=${index} ,以实现点击返回按钮时只关闭预览页面。其中 index 为该小图在图片列表中的索引值,该索引值为 swiper 需要设置显示的索引。

# 相关代码

图片列表页面:用户点击小图

computed: {
    // 显示 photo-swiper 组件,也可以用 watch 监听方式实现
    isShowSwiper() {
        return this.$route.hash.includes("#preview");
    }
}

methods: {
    // 预览图片,路由增加 preview hash 值
    preview(index) {
        this.$router.push(`#preview?index=${index}`);
    }
}

photo-swiper 组件页面

mounted() {
    // 阻止滚动穿透
    this.$preventScroll(true);

    // 获取当前需要展示的图片索引
    this.getInitIndex(); 

    // 初始化 swiper 组件
    this.$nextTick(() => {
        this.initSwiper();
    });
},

beforeDestroy() {
    // 页面销毁前,一定要移除 body 的禁止滚动
    this.$preventScroll(false);
},

methods: {
    // 初始化 swiper
    initSwiper() {
        let _this = this;

        new Swiper(".photo-swiper", {
            lazy: true,                     // 开启图片懒加载
            initialSlide: this.initIndex,   // 路由 hash 值传入的 index 索引
            observer: true,
            observeParents: true,
            watchSlidesVisibility: true,
            on: {
                slideChange: function () {
                    // 此处 this 指向 swiper 示例,activeIndex 为 swiper 滚动后的索引
                    _this.initIndex = this.activeIndex;
                }
            }
        })
    }
}
上次更新: 6/13/2022, 1:00:33 AM
示例展示,因PC端无touch事件,请在手机上进行浏览