【uniapp】上拉触底加载更多的两种方式,组件里面和页面里面 scroll-view组件和onReachBottom触底方法,以及部分安卓机型scroll-view很难触发问题,且可以固定表头

news2024/11/17 12:30:50

在这里插入图片描述
一般的话scroll-view在组件里面使用,而页面里面则使用onReachBottom()这个方法居多

1,onReachBottom 上拉触底后加载更多(未固定表头)

页面结构:

		<view class="box">
			<table border="0">
				<thead>
					<th>名称</th>
					<th style="width: 50px;">状态</th>
					<th>上传时间</th>
					<th style="width: 60px;">重量(kg)</th>
					<th style="width: 50px;">类型</th>
				</thead>
				<tr v-for="(item,index) in utrData" :key="index" class="trs">
					<td>{{item.name}}</td>
					<td>{{item.flag}}</td>
					<td>{{item.createDt}}</td>
					<td>{{item.weight}}</td>
					<td>{{item.typeCode}}</td>
				</tr>
			</table>
			<view class="zwsj">{{ moreContent }}</view>
		</view>
		

注意:
这个box的height要比屏幕的高度高5px或者10px,要不然它不会出现滚动条,没有滚动条就不会触发onReachBottom 这个触底方法了
当然,如果你确保你的数据首次查询的高度比屏幕的高度还高,那它自然就出现滚动条了,这个box就直接等于屏幕的高度就行
如果要考虑数据少于10条,且没有撑满屏幕,那这个box还是设置比屏幕高度高一点比较好.

	export default {
		data() {
			return {
				utrData: [],//列表数组
				pageNum: 1, // 页数
				total: 0,//每页总数
				flag: true, // 上拉加载开关 防止一次触底查询多次问题,防止数据查完后触底还调接口问题
				moreContent: '上拉加载更多数据...',
			}
		},
		methods: {
			//上拉加载更多
			getMoreList(){
				this.flag = true
				uni.request({
					...
					success:res => {
						if(res.data.status == 200){
							this.flag = false
							let result = res.data.data || []
							this.utrData = this.utrData.concat(result)
							if(result.length == 0 && this.pageNum == 1){
								// 一开始就没有数据
								this.moreContent = '暂无数据'
							}else{
								this.total = result ? result.length : 0
								if(this.total < 10){
								// 只有一页数据,不足10条
									this.moreContent = '数据已加载完,共' + this.utrData.length + '条'
									this.flag = true
								}
								// 有很多页
								this.pageNum += 1
							}
						}else{
							this.moreContent = '暂无数据'
							uni.showToast({
								title:res.data.message,
								icon:'none'
							});
						}
					} 
				});
			},
		},
		//监听页面触底函数
		onReachBottom(){
			if(!this.flag){
				this.getMoreList()
			}
		},
	}

如果没效果,先测试onReachBottom有没有触发,一般触发了基本上就没什么问题了

2,scroll-view组件上拉加载更多(固定表头)

ui组件: uview2.0
如果你不想固定表头,就不用 -37 就可以了
在这里插入图片描述
wx.getSystemInfoSync().windowHeight 获取当前屏幕的高度

	<view class="box" :style="{height: boxHeight + 48 + 37 + 'px'}">
		<view class="toptitle">
			<u-icon name="list-dot" color="#00c9d5" size="28"></u-icon>
			<text>具体信息</text>
		</view>
		<view class="content">
			<view class="thead">
				<text>code</text>
				<text>时间</text>
				<text>重量(kg)</text>
				<text>类型</text>
				<text>状态</text>
			</view>
			<view class="tbody" :style="{height: boxHeight + 'px'}" id="test">
				<scroll-view
					scroll-y="true"
					lower-threshold="10"
					:style="{height: boxHeight + 'px'}"
					@scrolltolower="scrolltolower">
						<view class="tableData" :style="{height: boxHeight + 10  + 'px'}">
							<view v-for="(item, index) in tableArr" :key="index">
								<text>{{ item.code }}</text>
								<text>{{ item.create_time }}</text>
								<text>{{ item.weight }}</text>
								<text>{{ item.type }}</text>
								<text>{{ item.location}}</text>
							</view>
							<view style="color: #aaa;">
								<text>{{loadingContent}}</text>
							</view>
						</view>
				</scroll-view>
			</view>
		</view>
	</view>

export default {
	data() {
		return {
			tableArr: [],
			boxHeight: wx.getSystemInfoSync().windowHeight - 48 - 37,
			loadingContent: '上拉加载更多数据...',
			total: 0, // 每页总数
			pageNum: 1,// 页数
			flag: true, // 控制上拉翻页
			testHeight: 0
		}
	},
	methods: {
		// 页面滚动触发
		scrolltolower(e) {
			if(!this.flag){
			 	this.getTable()
			 }
		},
		// 查询表格
		getTable(){
			let params = {
				p: this.pageNum
			}
			this.$get('xxx', params).then(res =>{
				this.flag = true
				let result = res.lsit || []
				this.tableArr = this.tableArr.concat(result)
				if(result.length == 0 && this.pageNum == 1){
					// 一开始就没数据
					this.loadingContent = '暂无数据'
				}else{
					this.total = result ? result.length : 0
					if(this.total < 10){
						this.moreContent = '数据已加载完,共' + this.utrData.length + '条'
						this.flag = true
					}
					this.flag = false
					this.pageNum += 1
				}
			})
		},
	},
}

3,scroll-view 部分安卓机型很难触发问题

ios用第二种方法没有问题,部分安卓用的话很难触发上拉加载更多,为什么部分安卓很难触发就不说了,自行百度

解决:
@scrolltolower 方法替换为 @scroll
@scrolltolower 方法是 scroll-view触底了就会触发,是触scroll-view组件的底部,不是触屏幕的底部
@scroll 方法是只要 scroll-view组件滑动了,就会触发这个方法

	methods: {
		// 页面滚动触发
		scrolltolower(e) {
			// 距离底部<100 并且是往上滑的动作
			if(e.detail.scrollHeight - e.detail.scrollTop - this.testHeight <= 100 && this.flag && e.detail.deltaY < 0){
					this.flag = false
					this.getTable()
				}
		},
		// 查询表格
		getTable(){
			let params = {
				p: this.pageNum
			}
			this.$get('xxx', params).then(res =>{
				this.flag = true
				let result = res.lsit || []
				if(result.length == 0 && this.pageNum == 1){
					// 一开始就没数据
					this.loadingContent = '暂无数据'
					this.flag = false
				}else{
					this.pageNum += 1
					this.total = result ? result.length : 0
					if(this.total < 10){
						this.moreContent = '数据已加载完,共' + this.utrData.length + '条'
						this.flag = false
					}
					this.tableArr = this.tableArr.concat(result)
					if(this.testHeight==0){
						let view = uni.createSelectorQuery().in(this).select("#test")
						view.fields({
							size: true,
							scrollOffset: true
						}, data => {
							this.testHeight=data.height
						}).exec();
					}
				}
			})
		},
	},

ok,没了,记录一下,哪里写的不对还请指出,谢谢,下期再见! ! !

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

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

相关文章

解决axios异步请求问题(异步变为同步)

遇到的问题 在目前一个需求中&#xff0c;我需要等待axios请求完成后&#xff0c;判断请求是否出现异常&#xff0c;然后来判断是否关闭弹窗 修改后大概代码如下&#xff1a; async submitForm() {let flag false//表单验证&#xff0c;默认通过let formValidation truethis…

HTML小游戏22 —— html5版疯狂光头强网页游戏(附完整源码)

&#x1f482; 网站推荐:【神级源码资源网】【摸鱼小游戏】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】本节教程我会带大家使用 HTML…

利用nvm下载nodejs

利用nvm下载nodejs 在开发过程会一直遇到nodejs的版本问题&#xff0c;直接安装则只有一个版本&#xff0c;极其不方便nvm则是用来管理nodejs的工具&#xff0c;可以通过nvm来安装切换不同版本的nodejs安装前需要先卸载自己原有的node版本&#xff0c;不然那会有可能报错。卸载…

在vue3+vite项目下按需引入vant报错Failed to resolve import解决方案

在vue3vite项目下按需引入vant报错Failed to resolve import解决方案问题描述原因分析解决方案问题描述 近日尝试使用vitevue3vant开发项目过程中&#xff0c;参考vant官网开发指南->快速上手->引入组件 按照上述配置好后&#xff0c;运行vite环境报错&#xff1a;Fai…

【JavaScript】【5】定时器(包含回调函数与Promise)

文章目录前言一、回调函数二、 Promisepromise对象Promise对象的生成加载图片写成一个Promise三、定时器与清除定时器的方法四、京东购物车倒计时案例五、发送验证码案例在这里插入图片描述总结前言 什么是定时器 JavaScript提供定时执行代码的功能&#xff0c;叫做定时器&…

【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目

【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目 文章目录【Vue全家桶】带你全面了解通过Vue CLI初始化Vue项目写在前面一、Vue CLI脚手架1.1 认识Vue CLI1.2 Vue CLI 安装和使用二、Vue create 项目的过程2.1 创建项目2.2选择 Manually select features创建2.3 选择Vue的版…

Vue Router4 ,prams 传参失效和报错问题

Vue3 使用 Vue Router 时&#xff0c;prams 传参失效和报错问题 我尝试使用 prams 传递数据 <script setup> import { useRouter } from vue-routerconst router useRouter() const params { id: 1, name: ly, phone: 13246566476, age: 23 } const toDetail () >…

HTML 实现仿 Windows 桌面主题特效

&#x1f482; 个人网站:【海拥】【摸鱼小游戏】【开发文档导航】&#x1f91f; 风趣幽默的人工智能学习网站&#xff1a;&#x1f449;人工智能&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】&#x1f4ac; 免费且实用的计算机相关知识题库&a…

vue 方法按照顺序执行

在调用后台方法的时候&#xff0c;由于调用了多个方法&#xff0c;但是执行的时候并没有按照顺序执行&#xff0c;前端需要后台返回的数据&#xff0c;对数据进行页面展示&#xff0c;由于没有按照顺序执行&#xff0c;导致前台页面报错。解决办法采用new Promise单独执行每个方…

Vue3父子组件间传参通信

Vue3 父子组件间通信前言一、父传子 defineProps二、子传父 defineEmits三、子组件暴露属性给父组件 defineExpose四、依赖注入Provide / Inject参考前言 本文主要是记录Vue3在setup语法糖下的父子组件间传参的四种方式 Vue3TypeScript 一、父传子 defineProps 父组件传值给…

使用TS对axios的进行简单封装

1.安装axios npm i axios2.在合适路径下新建request.ts&#xff08;名称可随意&#xff09;&#xff0c;例如可以在项目的src下创建utils文件夹创建request.ts 3.导入axios并创建axios实例 //引入axios import axios from axios//使用指定配置创建axios实例 const instance …

css字体加粗(dw怎么在css里字体加粗)

css怎么设置前3个字加粗 举个例子&#xff1a; 比如都在一个标签里 这里是文字内容文字内容文字内容文字内容文字内容文字内容文字内容文字内容 这里是文字内容文字内容文字内容文字内容文字内 这里是文字内容文字内容文字内容文字内容文字内 .test p span{font-weight:bold;} …

Linux 下使用 C++ 实现的 Web 文件服务器

项目地址&#xff1a; Github&#xff1a;https://github.com/shangguanyongshi/WebFileServer 在学习完成《TCP/IP 网络编程》和《Linux高性能服务器编程》后&#xff0c;阅读了一些Web服务器的相关代码&#xff0c;自动动手使用 C11 实现了这个 Linux 下简单 Web 文件服务器&…

使用 cpolar 内网穿透将本地 web 网站发布上线(无需服务器)

前言 当我们以本地电脑做服务器搭建web网站时&#xff0c;如何将它发布到互联网上&#xff0c;实现公网用户都可以访问内网的web网站就变得很重要。 这里我们以macOS系统自带的Apache为例&#xff0c;在本地启用Apache服务器&#xff0c;并通过cpolar内网穿透将其暴露至公网&…

vue国际化(多语言)

方法1&#xff1a;用 js-cookie 包 并且挂载在 main.js 上 1、安装 vue-i18n js-cookie 插件 npm install vue-i18n -S npm install js-cookie --save2、去检查一下你安装的 i18n 版本是不是 8.26.5 3、在 main.js 中引入 import VueI18n from vue-i18n; import cookie fro…

Echarts legend属性使用

Echarts的legend属性是对图例组件的相关配置 而legend就是Echarts图表中对图形的解释部分&#xff1a; 其中legend自身常用的配置属性如下&#xff1a; orient 设置图例的朝向 属性值&#xff1a; vertical // 垂直显示 或者 horizontal // 水平显示 legend: {orient: ver…

JavaScript——WebAPI(DOM)知识小结

目录 什么是WebAPI DOM API DMO树 DOM树&#xff1a; 选中页面元素&#xff1a; 事件 事件的三要素&#xff1a; 获取/修改元素内容 获取/修改元素属性 获取/修改表单元素属性 获取/修改样式属性 新增元素 删除元素 什么是WebAPI WebAPI是浏览器给js提供的功…

前后端 token 的使用

嗷呜, 预感又是一篇长的水文, 但是内心好激动哦 适用于前端(了解 node express 框架的人看), 想要了解后端的人看 好了, 开始废话模式 前后端 token 的使用 最近在做一个后台管理项目, 但是我一个卑微的前端我去哪里找接口的, 没有, 只好我自己写 哎, 我能有什么坏心思呢, 没有…

【React】使用Next.js构建并部署个人博客

&#x1f449; TypeScript学习&#xff1a;TypeScript从入门到精通 &#x1f449; 蓝桥杯真题解析&#xff1a;蓝桥杯Web国赛真题解析 &#x1f449; 个人简介&#xff1a;一个又菜又爱玩的前端小白&#x1f36c; &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01…

Server Tomcat v9.0 Server at localhost failed to start问题

Server Tomcat v9.0 Server at localhost failed to start问题解决办法。 在我们使用eclipse启动Tomcat时&#xff0c;有时会出现Server Tomcat v9.0 Server at localhost failed to start 的错误提示&#xff0c;导致无法成功启动&#xff0c;下面给出出现这种问题的简单解决…