微信小程序之使用上拉加载实现图片懒加载

在微信小程序中,有2个事件,相信大家都很熟悉
下拉重新加载
上拉加载更多
事件是这么个事件,至于事件触发后干嘛,那就看代码了
首先要在对应得地方xxxxpage.json打开这个

  "onReachBottomDistance": 100

至于这个值100还是多少要看你的实际情况,为了不让用户看到默认的框框啥的,应该是设置大一些!
xxxpage.js中

  onReachBottom(){//组件的class="lazyimage"var child =this.selectComponent('.lazyimage');if(child){child.onScrollIndex();//告知懒加载组件,触发了上拉触底事件}else{console.log(this);}}

然后就是我们的组件代码了 比如命名为lazyimage
lazyimage.js

// components/goodsParse/goodsParse.js
Component({/*** 组件的属性列表*/properties: {parseData: {type: Array,value: []},param: {type: String},scrollindex:{type:Number,value:0,default:0},lazyload:{type:Boolean,value:false}},/*** 组件的初始数据*/data: {imageCount: 0,imagedatas:[],loadcount:0,current_load_height:0,//本次渲染的图片的总高度 如果本次渲染的总高度不足1500 则会再次渲染per_load_countcurrent_loaded_ok:false,//本次是否渲染完成per_load_min_height:1500,//每次至少渲染多少高度per_load_count:3//每次渲染的张数,如果渲染的总高度不足,会继续渲染},/*** 组件的方法列表*/methods: {handleImgtap() {},onImageLoad(e) {this.data.imageCount ++//又不用渲染UI 所以下面的代码没必要// this.setData({//   imageCount: this.data.imageCount// })if(e.detail){if(e.detail.height){//本张图片渲染的高度this.data.current_load_height+=e.detail.height;}}if(this.data.lazyload){//本次懒加载的图片已经加载完成了if(this.data.imageCount == this.data.loadcount){this.data.current_loaded_ok=true;this.triggerEvent('onImageLoad', this.data.imageCount);//未完待续 如果还可以继续加载,如果刚刚加载的总高度小于屏幕的总高度,则继续贪婪加载if(this.data.current_load_height<this.data.per_load_min_height){//本次渲染的高度太小了,看看是否可以继续渲染,再次渲染3张this.loadNext(this.data.per_load_count);}}}else{//非懒加载if(this.data.imageCount == this.data.imagedatas.length){this.triggerEvent('onImageLoad', this.data.imageCount);}}//如果渲染不够,还可以继续渲染// console.log(e);//可以通过e来计算本次加载是否足够,不够的话补足剩余的数量},loadNext(num){if(this.data.loadcount<this.data.imagedatas.length){//渲染接下来的N个?var _max = this.data.imagedatas.length;if(this.data.loadcount<(_max)){this.data.current_load_height=0;var _temptop = Math.min(this.data.loadcount+num,(_max));// console.log('loadcount',this.data.loadcount,'images',this.data.imagedatas.length,'temp',_temptop);if(_temptop>this.data.loadcount){var _new_array=new Array();var _datas =this.data.imagedatas;for(var k=this.data.loadcount;k<_temptop;k++){if(this.data.imagedatas.length>k){_new_array.push({vkey:'imagedatas['+k+'].src',src:_datas[k].presrc});}}if(_new_array.length>0){var _obj={};for(var ii of _new_array){_obj[ii.vkey]=ii.src}this.setData(_obj);// console.log('set new images src!');}this.data.loadcount = _temptop;}}}},onScrollIndex(){//这个函数是给外部调用的,一般发生在上拉触底(要基于实际去设定这个高度值)的时候if(this.data.imagedatas.length ==this.data.loadcount){// console.log('已经全部完成渲染,无法继续执行更多的懒加载');//已经全部懒加载完成,不需要继续加载了return;}if(!this.data.current_loaded_ok){// console.log('上一次的渲染未完成··· ·· ·');return;}// console.log('parent`s scroll-view scroll to lower!');if(this.data.imageCount<this.data.loadcount){// console.log('之前加载的图片还未完全加载完成');return;}this.loadNext(this.data.per_load_count);},requireLoadAll(){//父级页面要求加载全部if(this.data.loadcount != this.data.imagedatas.length){var _n = this.data.imagedatas.length-this.data.loadcount;if(_n>0){if(!this.data.current_loaded_ok){// console.log('上一次的渲染未完成··· ·· ·');return;}// console.log('parent`s scroll-view scroll to lower!');if(this.data.imageCount<this.data.loadcount){// console.log('之前加载的图片还未完全加载完成');return;}this.loadNext(_n);}}}},attached(){// console.log('load goods-parse attached!');var _lazyload=this.data.lazyload;if(this.data.parseData!=null && this.data.parseData.length>0){var _imgarray=new Array();var _i =0;for(var img of this.data.parseData){_i ++;if(_i<= this.data.per_load_count || !_lazyload){_imgarray.push({src:img,presrc:img});}else{_imgarray.push({src:null,presrc:img});}}this.data.loadcount =this.data.per_load_count;//当前有渲染的序号this.setData({imagedatas:_imgarray});console.log(_imgarray);}}
})

对应的lazyimage.wxml代码如下(这个看你的实际情况修改)

<view class="parse_box"><block ><view class="u-padding-top-10" style="font-size:0px;"><block wx:if="{{parseData}}"><view><block wx:for="{{imagedatas}}" wx:for-item="item" wx:for-index="index" wx:key="index"><block wx:if="{{item.src}}"><image class="parse_image" src="{{item.src}}" mode="widthFix" bindload="onImageLoad" binderror="onImageLoad"/></block></block></view></block></view></block>
</view>

至于样式就不贴了!
这个组件适用于单图横向100vw的模式,比如商品的图片列表纵向显示
关键点在于
图片数据是parseData
比如:
[“https://xxx.jpg”,“https://xxx.jpg”]
转化成imagedatas
比如
[{
presrc:“”,
src:null
}]
除了一开始的数量设置src为对应的图片地址,后面的都是设置null
然后在上拉触底事件触发的时候,再把后面的图片对象设置src=presrc!

然后就是高度的判断,有可能比如你配置每次加载3张图,如果这三张图的高度不够一屏,那体验上用户就能看到图片还在加载了!
所以代码上做了一个贪婪模式,就是图片load后,去计算本次加载的总高度,是否满足,不够的话再多懒加载一次!
看函数代码

 onImageLoad(e) {this.data.imageCount ++//又不用渲染UI 所以下面的代码没必要// this.setData({//   imageCount: this.data.imageCount// })if(e.detail){if(e.detail.height){//本张图片渲染的高度this.data.current_load_height+=e.detail.height;}}if(this.data.lazyload){//本次懒加载的图片已经加载完成了if(this.data.imageCount == this.data.loadcount){this.data.current_loaded_ok=true;this.triggerEvent('onImageLoad', this.data.imageCount);//未完待续 如果还可以继续加载,如果刚刚加载的总高度小于屏幕的总高度,则继续贪婪加载if(this.data.current_load_height<this.data.per_load_min_height){//本次渲染的高度太小了,看看是否可以继续渲染,再次渲染3张this.loadNext(this.data.per_load_count);}}}else{//非懒加载if(this.data.imageCount == this.data.imagedatas.length){this.triggerEvent('onImageLoad', this.data.imageCount);}}//如果渲染不够,还可以继续渲染// console.log(e);//可以通过e来计算本次加载是否足够,不够的话补足剩余的数量},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小红薯做私域的9个重要步骤!

做私域如何找到安全、有效且高效的yin流方法&#xff01;&#xff01;应该是大家醉醉关心的问题了吧&#xff0c;有很多伙伴们要 么被jin言w规了&#xff0c;要么正在去往被xian流的路上… 1w个s域好友>10w粉丝的变现价值&#xff01; 今天就一次性给大家总结了&#xff1a;…

pom.xml中重要标签介绍

在 Maven 项目中&#xff0c;pom.xml 文件是项目对象模型&#xff08;POM&#xff09;的配置文件&#xff0c;它定义了项目的依赖关系、插件、构建配置等。以下是 pom.xml 文件中一些重要的标签及其作用&#xff1a; <modelVersion>&#xff1a; 定义 POM 模型的版本。当…

MySQL 面试相关问题

写在前面&#xff1a; 不喜勿喷&#xff0c;暴躁作者又不求你给钱【没办法&#xff0c;遇见的狗喷子太多了&#x1f436;】欢迎大家在评论区留言&#xff0c;指正文章中的信息错误有一些其他相关的问题&#xff0c;可以直接评论区留言&#xff0c;作者看到会及时更新到文章末尾…

【thingsbord源码编译】 显示node内存不足

编译thingsbord显示报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory问题原因分析 重新安装java版本 编译通过

F1-score

F1-score F1-score 是一种衡量分类模型性能的指标&#xff0c;特别适用于处理极度不平衡的数据集&#xff0c;F1-score 的取值范围是从0到1&#xff0c;数值越大&#xff0c;表示性能越好。 计算公式&#xff1a; F1-score是精确率和召回率的调和平均数。 ∗ ∗ F 1 s c o r e…

数据分析的汇报与观点表达

什么是数据图表? 基于数据的规模,趋势,占比,关系等情况制作出来的图表。 什么是数据表达? 基于数据化的表、图、文说明事实表达观点。 目的 将业务细节转化成数据,借助数据来认知业务,数据表达就可以更好地说明现状,阐述事实,更多情况是论证观点。 为什么要基于数…

Ubuntu实战续篇:Apache httpd轻松搭建高效代理服务器

Ubuntu实战续篇&#xff1a;Apache httpd轻松搭建高效代理服务器 一、前言二、Ubuntu下的Apache配置文件概览三、配置并启用 Apache 代理服务 作者&#xff1a;高玉涵 时间&#xff1a;2024.7.11 21:06 博客&#xff1a;blog.csdn.net/cg_i 环境&#xff1a;Ubuntu 22.04.4 LTS…

基于React 实现井字棋

一、简介 这篇文章会基于React 实现井字棋小游戏功能。 二、效果演示 三、技术实现 import {useEffect, useState} from "react";export default (props) > {return <Board/> }const Board () > {let initialState [[, , ], [, , ], [, , ]];const [s…

yolov8、RTDETR无法使用多个GPU训练

yolov8、RTDETR无法使用多个GPU训练 网上看了好多解决方法&#xff1a; 什么命令行 CUDA_VISIBLE_DEVICES0,1 python train.py 环境变量都不行 最后找到解决方案&#xff1a;在ultralytics/engine/trainer.py 中的第246行 将 self.model DDP(self.model, device_ids[RANK])…

固体物理学习笔记(持续更新

目录 固体物理学&#xff08;黄昆&#xff09;晶格周期性的函数 固体物理学&#xff08;黄昆&#xff09; 晶格周期性的函数 记晶格基矢 a 1 , a 2 , a 3 a_1, a_2, a_3 a1​,a2​,a3​和倒格矢 b 1 , b 2 , b 3 b_1,b_2,b_3 b1​,b2​,b3​。一个具有晶格周期性的函数可以定…

【LeetCode】面试题 16.21. 交换和

质量还不错的一道题&#xff0c;适合用于考察二分法。 1. 题目 2. 分析 求出两个数组的总和&#xff0c;我们令总和少的为less&#xff0c;总和多的为more&#xff1b;如果两个数组的总和是奇数&#xff0c;那么怎么都配不平&#xff0c;直接返回false&#xff1b;如果两个数…

生物环保技术在哪些场景中有优势呢

生物环保技术在多个场景中展现出显著的优势&#xff0c;这些优势主要源于其绿色环保、高效节能、可持续发展等特性。以下是生物环保技术在不同场景中的优势分析&#xff1a; 一、污水处理 高效降解有机物&#xff1a;生物环保技术利用微生物的代谢功能&#xff0c;能够高效地…

OWASP ZAP

OWASP ZAP简介 开放式Web应用程序安全项目&#xff08;OWASP&#xff0c;Open Web Application Security Project&#xff09;是一个组织&#xff0c;它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。ZAP则是OWASP里的工具类项目&#xff0c;也是旗舰项目&a…

VBA 批量发送邮件

1. 布局 2. 代码 前期绑定的话&#xff0c;需要勾选 Microsoft Outlook 16.0 Object Library Option ExplicitConst SEND_Y As String "Yes" Const SEND_N As String "No" Const SEND_SELECT_ALL As String "Select All" Const SEND_CANCEL…

Vue从零到实战第一天

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

【PostgreSQL】Spring boot + Mybatis-plus + PostgreSQL 处理json类型情况

Spring boot Mybatis-plus PostgreSQL 处理json类型情况 一、前言二、技术栈三、背景分析四、方案分析4.1 在PostgreSQL 数据库中直接存储 json 对象4.2 在PostgreSQL 数据库中存储 json 字符串 五、自定义类型处理器5.1 定义类型处理器5.2 使用自定义类型处理器 一、前言 在…

SpringCloud--Eureka集群

Eureka注册中心集群 为什么要集群 如果只有一个注册中心服务器&#xff0c;会存在单点故障&#xff0c;不可以高并发处理所以要集群。 如何集群 准备三个EurekaServer 相互注册&#xff0c;也就是说每个EurekaServer都需要向所有的EureakServer注册&#xff0c;包括自己 &a…

遇到NotOfficeXmlFileException

org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file 这个异常通常发生在你尝试使用 Apache POI 库来读取或处理一个不是有效的 Office Open XML 文件&#xff08;如 .xls…

项目管理工作分解结构(WBS)指南

在项目管理领域&#xff0c;工作分解结构&#xff08;WBS&#xff09;是一种关键的技术&#xff0c;它涉及将项目的整体可交付成果分解为更小的、更易于管理的部分。 值得注意的是&#xff0c;WBS的焦点在于可交付成果的分解&#xff0c;而非工作任务的细分。这种方法在项目管…

漏洞扫描器之XRAY的安装及破解

XRAY简介 xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;主要特性有&#xff1a; 检测速度快&#xff1a;发包速度快 ; 漏洞检测算法高效。 支持范围广&#xff1a;大至 OWASP Top 10 通用漏洞检测&#xff0c;小至…