uni-app 图片懒加载

功能

实现图片懒加载,并且显示数组中,始终只有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 = 1this.swiperItems.shift()
}, 0)

上滑时

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

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

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

 this.swiperItems.pop()          setTimeout(() => {this.atPresentNode.swiperIndex = 1this.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 : 0index = +index ? +index - 1 : 0this.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.swiperIndexif ((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 = 1this.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 = 1this.swiperItems.unshift(this.items[this.atPresentNode.itemsIndex - 1])}, 0)}}}}

uni-app 图片懒加载相关推荐

  1. Vue3电商项目实战-首页模块7【26-首页主体-商品区块、27-首页主体-最新专题、28-首页主体-图片懒加载】

    文章目录 26-首页主体-商品区块 27-首页主体-最新专题 28-首页主体-图片懒加载 26-首页主体-商品区块 目的: 完成商品区域展示. 大致步骤: 准备一个商品盒子组件 home-goods ...

  2. uniapp实战项目 (仿知识星球App) - - 实现图片懒加载

    实战项目名称:仿知识星球App 技术栈:前端 => uni-app ( 后端:Node.js + Mysql + Apollo + Graphql ) 已实现功能:微信登录,创建星球,内容管理, ...

  3. 前端性能优化的重要方案:图片懒加载

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...

  4. js实现审批流_小程序瀑布流组件:支持翻页与图片懒加载

    电商小程序中,用到瀑布流的地方非常多,每次都写一个瀑布流,重复一次逻辑,作为程序员,肯定是非常不愿意的. 瀑布流的形式都是大同小异,不同的是瀑布流中每个模块的内容,随业务而变化. 所以,我们把瀑布流框 ...

  5. swiper 定义放多少张图片_小程序瀑布流组件:支持翻页与图片懒加载

    (给前端大全加星标,提升前端技能) 作者:老人羽海 https://segmentfault.com/a/1190000022680541 电商小程序中,用到瀑布流的地方非常多,每次都写一个瀑布流,重 ...

  6. vue3 图片懒加载的实现

    什么是图片懒加载? 图片懒加载就是鼠标滑到哪,图片就加载到哪 一 开始把图片的地址放在data-set属性中,而不是放在src中,这样图片就不会发送http请求.我们通过计算距离,当 整个页面的高度 ...

  7. [js] 图片懒加载

    懒加载使用场景 在一些图片量比较大的场景(电商首页,小程序首页等),如果我们打开页面时就加载所有的图片,那势必会导致页面的卡顿以及白屏,给用户不好的体验,导致用户流失. 但是我们仔细想一下,用户真的需 ...

  8. 前端图片渲染性能优化与实践 — 图片懒加载

    前言 对于图片量比较大的点上首页APP等,在打开商品展示页面的时候需要再加大量图片,在这种场景下如果直接全量加载,必然会造成页面性能消耗过大,白屏或者卡顿,用户体验非常糟糕,用户真的需要我们显示所有图 ...

  9. 图片懒加载以及数据懒加载

    当一个单页面应用加载发送的请求很多时,页面可能会出来的很慢影响用户体验,此时我们就可以对项目进行优化,使用数据懒加载以及图片懒加载优化网络性能.懒加载的原理是当组件对象或者Dom对象出现在可视区域的时 ...

最新文章

  1. Docker Swarm Mode 学习笔记(聊聊 replicas)
  2. Java 使用ZeroMQ 2.2 进行通信编程
  3. Linux下独立添加PHP扩展模块 mssql
  4. qt+vs2017环境下XIMEA相机库的配置
  5. 沃森变频器故障12_维修电工浅谈:常见的变频器故障及处理
  6. 干趴面试官系列 | 请你简述一下Kafka中的分区分配
  7. pythonlive2d_Unity-Live2D资源载入
  8. hutool 自定义excel_Hutool Java 工具类库导出 Excel,超级简单!
  9. elementUI的DatePicker+DateTimePicker组件的自定义日期禁用
  10. 20145328 《Java程序设计》第7周学习总结
  11. 搜索复习-基础水题(一共12道)
  12. 关联规则挖掘之FPGrowth算法实现
  13. 【AI应用】海康威视iVMS-4200软件安装
  14. Unix网络编程之epoll函数模拟10万客户端链接服务器
  15. 程序员使用C#编写表白小软件(VS2013)(表白程序)
  16. ATSC /DVB SI/PSI 主要的区别
  17. 【链世纪对话系列No.9】浪潮存储资深架构师叶毓睿:浪潮如何助力分布式云存储数据中心快速发展?
  18. ubuntu开启键盘背光灯
  19. STM32 USB组合设备HID+MIDI
  20. RepeatMasker的安装与使用(一)

热门文章

  1. PhantomJS+Selenium爬取淘宝
  2. Java的excel去除空行(包括带有格式的空行)
  3. 读完《筚路蓝缕——世纪工程决策建设记述》
  4. WPF-隐藏窗体标题栏和边框
  5. 【系列】区块链与以太坊实战(1)-基础知识
  6. 【linux】重新启动项目
  7. iPhone 界面尺寸以及各种图表尺寸
  8. Linux系统编程 74 孤儿进程和僵尸进程
  9. python写入csv文件中添加行_在python中为csv文件输出键添加值
  10. ofd在线预览功能开发 前端