介绍
监听 scroll 事件实现图片懒加载、预加载
特点:
- 支持scroll组件或原生事件
- 支持自定义动画或图片+css
- 支持添加配置文件
- 支持预加载
- 支持设置加载间隔时间和最少过度动画时间
- 支持scroll节流
- 支持选项卡切换
- 支持多加载
下载地址
github: https://github.com/2460392754/uniapp-tools/tree/master/lazyLoad
dcloud: https://ext.dcloud.net.cn/plugin?id=495
更新日志
https://ext.dcloud.net.cn/plugin?id=495&update_log
1.兼容性测试
✅微信小程序
✅h5
✅android
❓其他平台(没测试)
2.目录结构
demo项目├── components│ ├── lazyLoad│ │ ├── anime 自定义动画组件│ │ │ ├── error-1.vue│ │ │ ├── loading-1.vue│ │ │ └── loading-2.vue│ │ ├── AnimeStateSwitch.vue│ │ ├── errorExport.vue│ │ ├── index.vue lazyLoad组件│ │ └── loadingExport.vue│ └── tabs.vue├── pages│ ├── index│ │ └── index.vue│ └── type│ ├── index.vue│ ├── many.vue│ ├── native.vue│ ├── tabs.vue│ └── vertical.vue├── plugins│ └── lazyLoad│ ├── js│ │ ├── core│ │ │ ├── index.js 数据封装│ │ │ ├── node.js 节点处理│ │ │ └── subscribe.js 订阅者模式│ │ ├── config.js 配置文件│ │ ├── default.js 部分默认数据│ │ ├── index.d.ts│ │ ├── index.js 导出│ │ └── tools.js 工具类│ └── ts├── static│ ├── cat│ │ ├── 1.jpg│ │ ├── 2.jpg│ │ └── 3.jpg│ ├── dog│ │ ├── 1.jpg│ │ ├── 2.jpg│ │ ├── 3.jpg│ │ ├── 4.jpg│ │ ├── 5.jpg│ │ └── 6.jpg│ ├── error_1.png│ ├── error_2.png│ ├── error.png│ ├── loading.png│ └── logo.png├── App.vue├── main.js├── manifest.json└── pages.json
3.运行流程图
暂无
4.设置插件配置文件(config.js)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| loading | Object | 是 | 加载完成之前的替代图片或者动画组件 | |
| error | Object | 加载错误的替代图片或者动画组件 | ||
| preLoadNum | Number | 0 | 预加载图片,单位 px | |
| intervalTime | Number | 0 | 图片加载间隔(停顿)时间,单位 ms | |
| minLoadAnimeTime | Number | 0 | 最少过度动画时间,单位 ms | |
| throttleTime | Number | 0 | scroll节流时间, 单位 ms | |
| animeSwitchTime | Number | 500 | 过度动画时间, 单位 ms | |
| everyLoadQuantity | Number | 1 | 每次加载数量 | |
| debug | Boolean | false | 开启调试, 控制台打印数据 |
loading、error对象参数列表
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| loading.type、error.type | String | 是 | 类型,合法值: component、img |
| loading.name、error.name | String | 组件名称 | |
| loading.path、error.path | String | 图片路径 |
config.js
export default {loading: { // 加载完成之前的替代图片或者动画组件type: 'component',name: 'loading-1'},// loading: {// type: 'img',// path: '/static/loading.png'// },// error: { // 加载错误的替代图片// type: 'img',// path: '/static/error_1.png'// },error: {type: 'component',name: 'error-1'},// 预加载图片,单位 pxpreLoadNum: 100,// 图片加载间隔(停顿)时间,单位 msintervalTime: 500,// 最少加载动画时间,单位 msminLoadAnimeTime: 500,// scroll事件节流时间, 单位 msthrottleTime: 200,// 动画过度时间,单位 msanimeSwitchTime: 500,// 每次加载数量everyLoadQuantity: 2,// 开启调试打印debug: false};
5.插件参数列表(core/index.js)
init(object)
初始化数据,并加载一次首屏的组件,需要等lazyLoad组件加载完成后在初始化,例如从网络请求获取的图片列表
object参数列表
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| id | String | 是 | scroll的id | |
| horizontal | Boolean | false | 是否横屏加载 | |
| context | Object | 组件的上下文(this)。封装成组件嵌套使用时,需要填写被封装组件的上下文 |
scroll()
监听scroll事件
getConfig()
获取config.js和default.js合并后的config数据
setScrollId(string)
切换scroll的Id
destroy()
卸载当前页面数据
6.组件参数列表
object参数列表
| 参数 | 类型 | 必填 | 默认值 | 版本 | 说明 |
|---|---|---|---|---|---|
| src | String | 是 | 图片路径 | ||
| scrollId | String | 是 | 当前组件所在的scroll标签内的id | ||
| mode | String | scaleToFill | 图片裁剪、缩放的模式 | ||
| className | String | v1.3.2 | 自定义样式名称 |
6.设置自定义动画组件
由于小程序的系统限制,没法动态插入vue组件,默认已经添加了1组组件,需要额外配置动画组件配置可能有点麻烦。不喜欢的,也可以直接使用图片+css3替代。
例: error动画组件配置
type的值就是config.js中填写的组件名称
<template><view><error1 v-if="type === 'error-1'"></error1></view></template><script>import error1 from './anime/error-1.vue';export default {// 组件名称props: {type: String},components: {error1}}</script>
7.如何使用
代码不贴出来了,下载demo查看代码
页面内的多组件切换并使用懒加载,使用方法和 tabs.vue 差不多,自己修改一下代码应该就行了
8.问题
Q: 替代图片加载错误的error组件或者图片加载显示比正常图片显示速度略快。
A: 暂时没有解决方案,也不太想解决。如果有需要,可以自己修改源码
Q: scroll和懒组件被封装后导致抛出异常”scroll样式id错误或未能获取当前属性“
A: 修改组件的上下文
Q:
问题: app端出现只能加载第一次图片
hbuilderX版本: 2.3.3.20190923
出现bug的原因: 到2019.10.11为止,app端暂且不支持Promise.prototype.finally (坑)
A:
v1.3.1已经修复这个bug
已经官方的github反馈这个问题了,待修复!
删除或者注释掉这个方法
最后
出现bug了?
遇到无法解决的问题?
直接加我q或者发邮件也行
email: 2460392754@qq.com
qq: 2460392754
欢迎交流或探讨问题!
