介绍
监听 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'
},
// 预加载图片,单位 px
preLoadNum: 100,
// 图片加载间隔(停顿)时间,单位 ms
intervalTime: 500,
// 最少加载动画时间,单位 ms
minLoadAnimeTime: 500,
// scroll事件节流时间, 单位 ms
throttleTime: 200,
// 动画过度时间,单位 ms
animeSwitchTime: 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
欢迎交流或探讨问题!