评论

动态预加载 swiper-item 中的图片(延迟加载)

使用 swiper 展示图片,为了避免一次加载多张图片而影响性能且浪费资源,用最笨的方法实现动态预加载 swiper-item 中的图片 。

在使用 swiper 时,有些场景需要一次载入的图片太多,消耗资源的同时也会影响用户体验。

自己的解决方法是这样的:

  1. 创建图片【地址数组】
  2. 根据需要展示图片的总数创建一个空的数组,即用来页面绑定的【页面数组】
  3. 初始化【页面数组】,为第 1、2 项赋值
  4. 当向右滑动时,接着为【页面数组】的第 3 项赋值
  5. 直到全部展示完毕

如果用户提前离开,就能避免未展示项图片的加载。

代码如下:

<view class="s-page">
    <swiper class="s-swiper"
            snap-to-edge="false"
            indicator-dots="true"
            bindchange="swiperChange">
        <block wx:for="{{pageList}}"
               wx:key="*this">
            <swiper-item class="s-swiper_item">
                <view>{{item}}</view>
            </swiper-item>
        </block>
    </swiper>
</view>


Page({

    /**
     * 页面的初始数据
     */
    data: {
        imageUrlList: ['url 1', 'url 2', 'url 3', 'url 4', 'url 5', 'url 6', 'url 7'],
        pageList: [],
        currentPageIndex: 0
    },


    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function (options) {
        // 根据图片总数,创建需要渲染的空数组
        let pageList = new Array(this.data.imageUrlList.length).fill('');
        // 初始化渲染数组,载入第1张,并且预载入下一张
        pageList[this.data.currentPageIndex] = this.data.imageUrlList[this.data.currentPageIndex];
        pageList[this.data.currentPageIndex + 1] = this.data.imageUrlList[this.data.currentPageIndex + 1];
        // 渲染页面
        this.setData({
            pageList: pageList
        })
        console.log(this.data.pageList);
    },

    swiperChange: function (e) {
        let
            oldPageIndex = this.data.currentPageIndex, // 之前展示的页面索引
            newPageIndex = e.detail.current; // 滑动后新展示的页面索引

        // 判断是否由用户触摸引起的
        if (e.detail.source == 'touch') {
            console.log(newPageIndex);
            // 判断滑动方向
            if (oldPageIndex < newPageIndex) {
                console.log('向右滑动');
                // 判断是否到最后一张,并且地址信息是否为空
                if (newPageIndex < this.data.imageUrlList.length - 1 && !this.data.pageList[newPageIndex + 1]) {
                    this.data.pageList[newPageIndex + 1] = this.data.imageUrlList[newPageIndex + 1]
                    console.log('预加载成功');
                }
                // 渲染页面
                this.setData({
                    currentPageIndex: newPageIndex,
                    pageList: this.data.pageList
                })
            } else if (oldPageIndex > newPageIndex) {
                console.log('向左滑动');
                this.data.currentPageIndex = newPageIndex;
            }
        }
        console.log(this.data.pageList);
    }
})


如果不显示“面板指示点”,那么【页面数组】直接创建一个空数组即可。

自己的笨办法,如果有更好的方法,请不吝赐教!

最后一次编辑于  2021-07-07  
点赞 4
收藏
评论

3 个评论

  • xplee
    xplee
    2021-07-08

    不错,简单明了

    2021-07-08
    赞同 1
    回复 1
    • 觀·自在
      觀·自在
      2021-07-09
      谢谢鼓励
      2021-07-09
      回复
  • 阿豆豆童
    阿豆豆童
    2022-04-22

    为什么我在公众号后台编辑图文的时候可以看到图片滑动的模块,可是到手机端预览的时候,图片就变成竖着排列了,完全丧失滑动预览的功能了?

    2022-04-22
    赞同
    回复
  • Group
    Group
    2022-01-26

    我的图片是要通过wx.cloud.downloadFile()方法加载,不知道能不能要你的方案解决多图加载问题?


    2022-01-26
    赞同
    回复
登录 后发表内容