开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2078|回复: 0
收起左侧

[技术分享] uni-app 图片懒加载

[复制链接]
发表于 2021-10-29 16:21:20 | 显示全部楼层 |阅读模式   广东省揭阳市

功能

  • 实现图片懒加载,并且显示数组中,始终只有3张图片,上下滑动增加的同时,删除最开始的那一张。可以指定从总图片的第几张开始加载。

思路

  • 要实现上下滑动时的动画效果,我这里用到是uni-app自带swiper组件。同时为了解决增加或删除数组时,会重新渲染,导致动画效果未完成,所以用的是animationfinish页面加载后触发的事件。
  • 要实现上下滑动时,动画执行完毕之后,要把执行后的那张图片,始终保持在中间位置。此处,就用到了serper组件中的current,当滑倒第3或者第1张时,给current赋值,使显示的图片始终在第二张的位置。同时滑动添加的同时,也要删除掉最开始的那一张

步骤

swiper组件使用

<swiper vertical="true"
            :current="atPresentNode.swiperIndex"
            @animationfinish="slideSwiper">
      <swiper-item v-for="item,index in swiperItems"
                   :key="index">
        <view>{{item}}</view>
      </swiper-item>
  </swiper>

初始化显示页面

当总图片数组索引位为0时,则定位到第一张图片。当总图片数组索引位>0时,则定位到第二张图片

let swiperIndex = index ? 1 : 0   //seriperIndex(显示数组索引位)
itemsIndex = index ? index - 1 : 0 // itemsIndex(总图片数组索引位),-1是数组从0开始
let minLength = Math.min(2, this.items.length - index) // 防止总索引位大于总的数组长

移动页面

1.判断上滑还是下滑

通过swiper组件current,可以得到当前页面索引值,减去未滑动前的页面索引值。大于0则是向下滑动,小于0则是向上滑动。

let currentNum = event.target.current - this.atPresentNode.swiperIndex

2.下滑时

判断当前页面图片是中间的那一张,并且总数组长度大于页面索引值+1时,加载第四张图片。

this.atPresentNode.swiperIndex >= 2 && this.items.length > this.atPresentNode.itemsIndex + 1

setTimeout是为了保证删除时,数组是已经添加进去了的

this.atPresentNode.swiperIndex = 1 保证滑动后的图片始终在中间位置
this.swiperItems.push(this.items[this.atPresentNode.itemsIndex + 1])
setTimeout(() => {
 this.atPresentNode.swiperIndex = 1
 this.swiperItems.shift()
}, 0)

上滑时

判断滑动之后是否在第一张的位置,并且 总索引位大于0

this.atPresentNode.swiperIndex <= 0 && this.atPresentNode.itemsIndex > 0

此处先删除后添加是由于先在头部添加时,会改变显示图片相对于数组的位置,显示图片的位置就向下延后了一位。所以为了避免这种情况,故而先删除,再添加到头部

 this.swiperItems.pop()          
 setTimeout(() => {
    this.atPresentNode.swiperIndex = 1
    this.swiperItems.unshift(this.items[this.atPresentNode.itemsIndex - 1])   
}, 0)

完整代码

  data () {
    return {
      index: 0, //从总数组第几位开始
      items: [], //总数组
      swiperItems: [], //显示数组
      atPresentNode: {
        swiperIndex: 0, // 显示数组索引位
        itemsIndex: 0, // 总数组索引位
      },
    }
  },
  created () {
    this.initSwiperItems(this.index)
  },
  methods: {
    initSwiperItems (index) {
      this.swiperItems = []
      if (this.items.length <= 0) { return }
      let swiperIndex = index ? 1 : 0
      index = +index ? +index - 1 : 0
      this.atPresentNode = {
        swiperIndex,
        itemsIndex: index,
      }
      let minLength = Math.min(2, this.items.length - index)
      for (let i = 0; i <= minLength; i++) {
        this.items[index + i] && this.swiperItems.push(this.items[index + i])
      }
      this.atPresentNode.swiperIndex == 1 && (this.atPresentNode.itemsIndex = this.atPresentNode.itemsIndex + 1) // 当从第二张显示时,总数组索引位也加一
    },
    slideSwiper (event) {
      let currentNum = event.target.current - this.atPresentNode.swiperIndex
      if ((this.items.length <= this.atPresentNode.itemsIndex + 1 || this.atPresentNode.itemsIndex == 0) && currentNum == 0) {
        uni.showToast({ title: '已经没有更多的数据了', icon: 'none' })
        return
      }
      if (currentNum > 0) {
        this.atPresentNode.swiperIndex++   //为了和current同步,所以此处需要++
        this.atPresentNode.itemsIndex++
        if (this.atPresentNode.swiperIndex >= 2 && this.items.length > this.atPresentNode.itemsIndex + 1) {
          this.swiperItems.push(this.items[this.atPresentNode.itemsIndex + 1])
          setTimeout(() => {
            this.atPresentNode.swiperIndex = 1
            this.swiperItems.shift()
          }, 0)
        }
      }
      if (currentNum < 0) {
        this.atPresentNode.swiperIndex--  //为了和current同步,所以此处需要--
        this.atPresentNode.itemsIndex--
        if (this.atPresentNode.swiperIndex <= 0 && this.atPresentNode.itemsIndex > 0) {
          this.swiperItems.pop()
          setTimeout(() => {
            this.atPresentNode.swiperIndex = 1
            this.swiperItems.unshift(this.items[this.atPresentNode.itemsIndex - 1])
          }, 0)
        }
      }
    }
  }
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表