介绍

开发不易,能给插件一个好评**吗,拜托了!**

监听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.全局参数(setConfig)

参数列表

参数 版本 类型 必填 默认值 说明
loading Object 加载完成之前的替代图片或者动画组件
error Object 加载错误的替代图片或者动画组件
preLoadNum Number 0 预加载图片,单位 px
intervalTime Number 0 图片加载间隔(停顿)时间,单位 ms
minLoadAnimeTime Number 0 最少过度动画时间,单位 ms
throttleTime v1.2.2 Number 0 scroll节流时间, 单位 ms

loading、error对象参数列表

参数 类型 必填 说明
loading.type、error.type String 类型,合法值: component、img
loading.name、error.name String 组件名称
loading.path、error.path String 图片路径

如何配置
或者封装成文件导入

  1. // main.js
  2. import lazyLoadPlugin from './plugins/lazyLoad/js/lazyLoad'
  3. lazyLoadPlugin.setConfig({
  4. loading: { // 加载完成之前的替代图片或者动画组件
  5. type: 'component',
  6. name: 'loading-1'
  7. },
  8. // loading: {
  9. // type: 'img',
  10. // path: '/static/loading.png'
  11. // },
  12. // error: { // 加载错误的替代图片或者动画组件
  13. // type: 'img',
  14. // path: '/static/error_1.png'
  15. // },
  16. error: {
  17. type: 'component',
  18. name: 'error-1'
  19. },
  20. preLoadNum: 100, // 预加载图片,单位 px
  21. intervalTime: 500, // 图片加载间隔(停顿)时间,单位 ms
  22. minLoadAnimeTime: 1000, // 最少过度动画时间,单位 ms
  23. throttleTime: 200 // 节流时间, 单位 ms
  24. })

4.自定义动画组件配置

由于小程序的系统限制,没法动态插入vue组件,所以动画组件配置可能有点麻烦。不喜欢的,也可以直接使用图片+css3替代。

components目录结构

  1. hBuilderX\lazyLoad\components
  2. └── lazyLoad
  3. ├── animation
  4. ├── error-1.vue
  5. ├── errorExport.vue
  6. ├── loading-1.vue
  7. └── loadingExport.vue
  8. └── index.vue

例: loading动画组件配置
type的值就是setConfig中填写的组件名称

  1. // loadingExport.vue
  2. <template>
  3. <view>
  4. <loading1 v-if="type === 'loading-1'"></loading1>
  5. </view>
  6. </template>
  7. <script>
  8. import loading1 from './loading-1.vue';
  9. export default {
  10. props: {
  11. type: String
  12. },
  13. components: {
  14. loading1
  15. }
  16. }
  17. </script>
  18. <style>
  19. </style>

5.如何使用

引入config.js

  1. // main.js
  2. // do somethind...
  3. import './plugins/lazyLoad/js/config.js'
  4. // do somethind...

scroll事件

  1. <template>
  2. <view>
  3. <scroll-view :scroll-y="true"
  4. @scroll="scroll"
  5. id="scroll">
  6. <!-- not exists img -->
  7. <view class='item'>
  8. <v-lazyload :src="'/static/dog/1123123.jpg'"
  9. mode="widthFix"></v-lazyload>
  10. </view>
  11. <view v-for="n of 6"
  12. :key="n"
  13. class='item'>
  14. <v-lazyload :src="'/static/dog/'+n+'.jpg'"
  15. mode="widthFix"></v-lazyload>
  16. </view>
  17. <!-- not exists img -->
  18. <view class='item'>
  19. <v-lazyload :src="'/static/dog/11231xasxasx23.jpg'"
  20. mode="widthFix"></v-lazyload>
  21. </view>
  22. </scroll-view>
  23. </view>
  24. </template>
  25. <script>
  26. import VLazyload from "@/components/lazyLoad/index.vue";
  27. import lazyLoadPlugin from '@/plugins/lazyLoad/js/lazyLoad.js'
  28. export default {
  29. methods: {
  30. scroll () {
  31. // 监听scroll事件
  32. lazyLoadPlugin.scroll();
  33. }
  34. },
  35. components: {
  36. VLazyload,
  37. },
  38. mounted () {
  39. // 初始化配置, scroll-view标签id, 第二个参数默认为false,横向懒加载,需要为 true
  40. lazyLoadPlugin.init('#scroll')
  41. },
  42. destroyed () {
  43. // 监听页面卸载
  44. lazyLoadPlugin.destroy();
  45. }
  46. }
  47. </script>
  48. <style>
  49. #scroll {
  50. height: 100vh; /* 需要给scroll-view设置高度 */
  51. background: #f8f8f9;
  52. }
  53. /* #ifdef H5*/
  54. #scroll >>> .img-lazyLoad .load-img {
  55. width: calc(100vw - 80px);
  56. height: 100px;
  57. border-radius: 10px;
  58. }
  59. #scroll >>> .img-lazyLoad .load-error-img {
  60. width: 100px;
  61. }
  62. /* #endif */
  63. /* #ifndef H5*/
  64. #scroll .img-lazyLoad .load-img {
  65. width: calc(100vw - 80px);
  66. height: 100px;
  67. border-radius: 10px;
  68. }
  69. #scroll .img-lazyLoad .load-error-img {
  70. width: 100px;
  71. }
  72. /* #endif */
  73. #scroll .img-lazyLoad .load-error-img {
  74. width: 100px;
  75. }
  76. .item {
  77. background: #fff;
  78. width: fit-content;
  79. padding: 20px;
  80. margin: 20px;
  81. border-radius: 10px;
  82. box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
  83. width: calc(100vw - 80px);
  84. /* min-height: 200px; */
  85. }
  86. </style>

原生事件

  1. <template>
  2. <view class='page'
  3. id="scroll">
  4. <view v-for="n of 6"
  5. :key="n"
  6. class='item'>
  7. <v-lazyload :src="'/static/dog/'+n+'.jpg'"
  8. mode="widthFix"></v-lazyload>
  9. </view>
  10. </view>
  11. </template>
  12. <script>
  13. import lazyLoadPlugin from '@/plugins/lazyLoad/js/lazyLoad.js'
  14. import VLazyload from "@/components/lazyLoad/index.vue";
  15. export default {
  16. onPageScroll () {
  17. lazyLoadPlugin.scroll();
  18. },
  19. mounted () {
  20. lazyLoadPlugin.init('#scroll')
  21. },
  22. destroyed () {
  23. // 监听页面卸载
  24. lazyLoadPlugin.destroy();
  25. },
  26. components: {
  27. VLazyload,
  28. },
  29. }
  30. </script>
  31. <style>
  32. #scroll {
  33. height: 100vh; /* 需要给scroll-view设置高度 */
  34. background: #f8f8f9;
  35. }
  36. /* #ifdef H5*/
  37. .page >>> .img-lazyLoad .load-img {
  38. width: calc(100vw - 80px);
  39. height: 100px;
  40. border-radius: 10px;
  41. }
  42. .page >>> .img-lazyLoad .load-error-img {
  43. width: 100px;
  44. }
  45. /* #endif */
  46. /* #ifndef H5*/
  47. .page .img-lazyLoad .load-img {
  48. width: calc(100vw - 80px);
  49. height: 100px;
  50. border-radius: 10px;
  51. }
  52. .page .img-lazyLoad .load-error-img {
  53. width: 100px;
  54. }
  55. /* #endif */
  56. .item {
  57. background: #fff;
  58. width: fit-content;
  59. padding: 20px;
  60. margin: 20px;
  61. border-radius: 10px;
  62. box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
  63. width: calc(100vw - 80px);
  64. /* min-height: 200px; */
  65. }
  66. </style>

选项卡切换

v1.2.3新增
选项卡的切换方式必须是v-show
需要lazyload的组件scrollid和它祖父级的scroll标签id设置一样
关于切换失效或者其他问题,请查看 示例项目 中的 ‘**@/components/nav.vue’ 这个组件和 ‘@/pages/horizontal/nav.vue’ 这个页面 源码**

  1. <template>
  2. <view class='nav-page'>
  3. <v-nav :name="nav"
  4. :change="change">
  5. <!-- tab-0 -->
  6. <view v-show="cur === 0">
  7. <scroll-view :scroll-y="true"
  8. @scroll="scroll"
  9. id="scroll-0">
  10. <view v-for="n of 6"
  11. :key="n"
  12. class='item'>
  13. <v-lazyload scrollid="scroll-0"
  14. mode="widthFix"
  15. :src="'/static/dog/'+n+'.jpg'"></v-lazyload>
  16. </view>
  17. </scroll-view>
  18. </view>
  19. <!-- tab-1 -->
  20. <view v-show="cur === 1">
  21. <scroll-view :scroll-y="true"
  22. @scroll="scroll"
  23. id="scroll-1">
  24. <view v-for="n of 3"
  25. :key="n"
  26. class='item'>
  27. <v-lazyload :src="'/static/cat/'+n+'.jpg'"
  28. scrollid="scroll-1"
  29. mode="widthFix"></v-lazyload>
  30. </view>
  31. </scroll-view>
  32. </view>
  33. </v-nav>
  34. </view>
  35. </template>
  36. <script>
  37. import VNav from '@/components/nav'
  38. import VLazyload from "@/components/lazyLoad/index.vue";
  39. import lazyLoadPlugin from '@/plugins/lazyLoad/js/lazyLoad.js'
  40. export default {
  41. data () {
  42. return {
  43. nav: [
  44. 'tab - 0',
  45. 'tab - 1'
  46. ],
  47. cur: 0
  48. }
  49. },
  50. methods: {
  51. change (i) {
  52. // console.log('is change', i)
  53. this.cur = i;
  54. // 切换 scroll标签id
  55. lazyLoadPlugin.setScrollId('#scroll-' + i);
  56. },
  57. scroll () {
  58. lazyLoadPlugin.scroll();
  59. }
  60. },
  61. mounted () {
  62. // 初始化配置, scroll-view标签id, 第二个参数默认为false,横向懒加载,需要为 true
  63. lazyLoadPlugin.init('#scroll-0', false)
  64. },
  65. destroyed () {
  66. // 监听页面卸载
  67. lazyLoadPlugin.destroy();
  68. },
  69. components: {
  70. VNav,
  71. VLazyload
  72. }
  73. }
  74. </script>
  75. <style>
  76. .nav-page {
  77. background: #f8f8f9;
  78. }
  79. #scroll-0,
  80. #scroll-1 {
  81. height: 100vh; /* 需要给scroll-view设置高度 */
  82. background: #f8f8f9;
  83. }
  84. /* #ifdef H5*/
  85. .nav-page >>> .img-lazyLoad .load-img {
  86. width: calc(100vw - 80px);
  87. height: 100px;
  88. border-radius: 10px;
  89. }
  90. .nav-page >>> .img-lazyLoad .load-error-img {
  91. width: 100px;
  92. }
  93. /* #endif */
  94. /* #ifndef H5*/
  95. .nav-page .img-lazyLoad .load-img {
  96. width: calc(100vw - 80px);
  97. height: 100px;
  98. border-radius: 10px;
  99. }
  100. .nav-page .img-lazyLoad .load-error-img {
  101. width: 100px;
  102. }
  103. /* #endif */
  104. .nav-page .img-lazyLoad .load-error-img {
  105. width: 100px;
  106. }
  107. .item {
  108. background: #fff;
  109. width: fit-content;
  110. padding: 20px;
  111. margin: 20px;
  112. border-radius: 10px;
  113. box-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);
  114. width: calc(100vw - 80px);
  115. /* min-height: 200px; */
  116. }
  117. </style>

6.问题

Q:懒加载组件中的图片样式如何设置
A:请查看上面demo中style标签的设置,或者查看源码也行

Q: 小程序平台或者其他平台中,懒组件被2次封装后图片样式设置不生效
A: 在pages文件夹中的页面中设置样式

Q: scroll和懒组件被封装后导致抛出异常”scroll样式id错误或未能获取当前属性
A: 修改组件的上下文(v1.2.4更新)

  1. lazyLoadPlugin.init('#scroll', false, { ctx: this })

最后

出现bug了?
遇到无法解决的问题?
直接加我q或者发邮件也行

email: 2460392754@qq.com
qq: 2460392754

欢迎交流或探讨问题!