uni-app使用swiper实现tab左右滑动下拉无法触发onReachBottom页面生命周期

2023-10-27

注意要点

1、通过uni.getSystemInfo获取设备具体高度,定义swiper的高度,将swiper撑开
2、利用scroll-view视图容器的@scrolltolower属性实现触底加载
3、点击tab切换也会触发swiper的@change属性,点击tab只需更改tabIndex (当前所处的tab下标),其他操作在是旁人的@change属性中进行处理即可

详细代码参考

<template>
	<view class="container">
		<!-- 状态栏 -->
		<view class="public-statusBar"></view>
		<!-- 状态栏end -->
		<!-- 自定义导航栏 -->
		<view class="public-navBar">
			<view @click="back" class="public-navLeft" open-type="switchTab">
				<uni-icons type="arrowleft" style="margin-left: -20rpx;" color="#000" size="26" />
			</view>
			<view class="public-navMiddle">列表页</view>
		</view>
		<!-- 自定义导航栏end -->
		<!-- tab切换 -->
		<view class="tab-titBar">
			<view v-for="(tit, index) in tabTit" :key="index" class="tab-titList jui-flex-center" :class="{ 'tab-titHover': index == tabIndex }" @click="tabChange(index)">
				{{ tit }}
				<text></text>
			</view>
		</view>
		<!-- tab切换end -->
		<!-- 列表 -->
		<view class="list-bar">
			<swiper class="swiper" :style="{ height: swiperHeight + 'px' }" :current="tabIndex" @change="swiperTab">
				<!-- 全部 -->
				<swiper-item>
					<scroll-view scroll-y="true" @scrolltolower="reachBottom">
						<!-- jui-h28顶部间隔,使用padding或margin内容撑不满整页会出现滚动条 -->
						<view class="jui-h28"></view>
						<!-- 暂无记录 -->
						<view v-if="status=='noData'" class="empty-bar">
							<image class="empty-image" src="../../static/icons/empty_icon.png" mode="widthFix"></image>
							<view class="empty-text">暂无报警记录</view>
						</view>
						<!-- 暂无记录 -->
						<block v-else>
							<view class="public-bar list-con" v-for="(item, index) in listItem" :key="index">
							<text>全部{{item}}</text>						
							</view>
							<view class="example-body" v-if="status!='noData'"><uni-load-more color="#007AFF" :status="status" /></view>
						</block>
					</scroll-view>
				</swiper-item>
				<!-- 全部end -->
				<!-- 未处理 -->
				<swiper-item>
					<scroll-view scroll-y="true" @scrolltolower="reachBottom">
						<!-- jui-h28顶部间隔,使用padding或margin内容撑不满整页会出现滚动条 -->
						<view class="jui-h28"></view>
						<!-- 未处理暂无记录 -->
						<view v-if="untreatedStatus=='noData'" class="empty-bar">
							<view class="empty-text">暂无未处理报警记录</view>
						</view>
						<!-- 未处理暂无记录 -->
						<block v-else>
							<view class="public-bar list-con" v-for="(item, index) in untreatedListItem" :key="index">
							<text>未处理{{item}}</text>						
							</view>
							<view class="example-body" v-if="untreatedStatus!='noData'"><uni-load-more color="#007AFF" :status="untreatedStatus" /></view>
						</block>
					</scroll-view>
				</swiper-item>
				<!-- 未处理end -->
				<!-- 已处理 -->
				<swiper-item>
					<scroll-view scroll-y="true" @scrolltolower="reachBottom">
						<!-- jui-h28顶部间隔,使用padding或margin内容撑不满整页会出现滚动条 -->
						<view class="jui-h28"></view>
						<!-- 已处理暂无记录 -->
						<view v-if="dealStatus=='noData'" class="empty-bar">
							<view class="empty-text">暂无已处理报警记录</view>
						</view>
						<!-- 已处理暂无记录 -->
						<block v-else>
							<view class="public-bar list-con" v-for="(item, index) in dealListItem" :key="index">
								<text>已处理{{item}}</text>				
							</view>
							<view class="example-body" v-if="dealStatus!='noData'"><uni-load-more color="#007AFF" :status="dealStatus" /></view>
						</block>						
					</scroll-view>
				</swiper-item>
				<!-- 已处理end -->
			</swiper>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				swiperHeight:'',				
				tabTit: ['全部', '未处理', '已处理'],
				tabIndex: 0,
				listItem:[],//全部列表
				untreatedListItem:[],//未处理列表
				dealListItem:[],//已处理列表
				pageSize:10, //每页数量
				pageNum:1, //全部当前页面
				untreatedPageNum:1, //未处理当前页面
				dealPageNum:1, //已处理当前页面
				status: 'loading',//全部加载状态
				untreatedStatus: 'loading',//未处理加载状态
				dealStatus: 'loading',//已处理加载状态
			}
		},
		//下拉刷新
		onPullDownRefresh() {
			//this.reset();
			if( this.tabIndex == 0 ){
				this.pageNum = 1;
				this.getList(this.pageNum);
			}else if( this.tabIndex == 1 ){
				this.untreatedPageNum = 1;
				this.getList(this.untreatedPageNum,0);
			}else{
				this.dealPageNum = 1;
				this.getList(this.dealPageNum,1);
			}
		},
		onLoad:function(options){
			uni.getSystemInfo({
			    success: (res) => {
					this.swiperHeight= res.windowHeight - res.statusBarHeight - 50 - 44;//定义swipr高度,44为导航栏高度,50为tab轮播高度,statusBarHeight状态栏高度
			    }
			});
		},
		mounted() {
			this.getList(this.pageNum); //获取列表,默认获取全部,tab切换时调取对应数据
		},
		methods: {
			//返回上一页
			back(){
				uni.navigateBack({
				    delta: 1
				});
			},
			//上拉加载
			reachBottom(e){
				if( this.tabIndex == 0 && this.status == 'more'){
					this.pageNum += 1;
					this.getList(this.pageNum);
				}else if( this.tabIndex == 1 && this.untreatedStatus == 'more'){
					this.untreatedPageNum += 1;
					this.getList(this.untreatedPageNum,0);
				}else if( this.tabIndex == 2 && this.dealStatus == 'more'){
					this.dealPageNum += 1;
					this.getList(this.dealPageNum,1);
				}
			},
			//获取列表信息
			getList(pageNum,bjDone=''){
				var param = {}
				if( pageNum == 1 ){
					if( this.tabIndex == 0 ){
						this.listItem = [];
					}else if( this.tabIndex == 1){
						this.untreatedListItem = [];
					}else{
						this.dealListItem = [];
					}					
				}
				this.$api.request({
					url: this.$api.接口名,
					data: param,
					onSuccess: data => {
						//console.log('data',data);
						if( data.code == 0 ){//接口调取成功
							if( data.total>0 ){
								if( this.tabIndex == 0 ){//全部
									this.listItem = this.listItem.concat(data.rows);
								}else if( this.tabIndex == 1){//未处理
									this.untreatedListItem = this.untreatedListItem.concat(data.rows);
								}else{
									this.dealListItem = this.dealListItem.concat(data.rows);
								}
								//加载状态处理
								if( this.tabIndex == 0 ){//全部
									this.status = data.rows.length == this.pageSize ? 'more' : 'noMore';
								}else if( this.tabIndex == 1){//未处理
									this.untreatedStatus = data.rows.length == this.pageSize ? 'more' : 'noMore';
								}else{
									this.dealStatus = data.rows.length == this.pageSize ? 'more' : 'noMore';
								}
							}else{
								if( this.tabIndex == 0 ){
									this.status = 'noData';
								}else if( this.tabIndex == 1){
									this.untreatedStatus = 'noData'; //未处理
								}else{
									this.dealStatus = 'noData'; //已处理
								}
							}
						}else{//接口调取失败
							uni.showToast({
								icon:'error',
								title: data.msg
							});
						}						
					},
				})
			},
			/*tab切换*/
			tabChange(i) {
				this.tabIndex = i;
			},
			//swiper滑动切换
			swiperTab(e) {
				this.tabIndex = e.target.current;
				if( this.tabIndex == 0 && this.listItem.length==0 ){
					this.getList(this.pageNum);
				}
				if( this.tabIndex == 1 && this.untreatedListItem.length==0 ){
					this.getList(this.untreatedPageNum,0);					
				}
				if( this.tabIndex == 2 && this.dealListItem.length==0 ){
					this.getList(this.dealPageNum,1);					
				}
			},
		}
	}
</script>

<style lang="scss" scoped>
	.tab-titBar{border-bottom: 1px solid #eff4f9;}
	.swiper scroll-view{ height:100%;}
	/*列表*/
	.list-bar {
		padding: 0rpx 32rpx;
		padding-top: calc(var(--status-bar-height) + 188rpx);
	}
	.list-con {
		background: #fff;
		padding: 24rpx;
		margin-bottom: 28rpx;
		position:relative;
	}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uni-app使用swiper实现tab左右滑动下拉无法触发onReachBottom页面生命周期 的相关文章

  • Markdown 文本居中、字体颜色以及数学公式

    文章目录 文本格式 文字居中 字体 字体颜色 字体大小 背景色 颜色 数学公式 希腊字母 行内与独行 上标 下标与组合 汉字 字体与格式 占位符 定界符与组合 四则运算 高级运算 逻辑运算 集合运算 数学符号 文本格式 文字居中 1 文字居
  • 数据结构---求最大公约数

    求最大公约数 穷举法 辗转相除法法 第一步 第二步 第三步 JAVA实现 更相减损术 第一步 第二步 第三步 JAVA实现 更相减损术与移位相结合 操作逻辑 例子 JAVA实现 写一段代码 求出两个整数的最大公约数 要尽量优化算法的性能 例
  • Python 处理错误和异常

    微信公众号 数据分析与统计学习如有问题或建议 请公众号留言最近更新时间 2018 7 2 一 前言 Python的系列文章主要介绍python语言的基础语法知识 按照核心内建数据类型 语句 函数 类 异常 标准模块的顺序对相关的语法知识进行
  • imx6ull开发板,usb免驱摄像头的配置

    在 dev下面 只能找到video0 说明开发板并没有识别出有新连接进来的摄像头 需要在内核中 配置支持UVC标准的USB驱动 重新配置即可
  • cve 爬虫_爬虫CNVD构建漏洞库

    import requests from lxml import etree import xlsxwriter from requests utils import add dict to cookiejar import execjs
  • 关于电路交换、报文交换和分组交换

    交换 所谓交换 指的就是服务器与服务器之间的数据交换 考纲要求掌握三种 电路交换 报文交换和分组交换 这篇文章主要介绍这三种交换方式 以及分组交换中的数据报和虚电路 电路交换 电路交换即在通信之前 在通信双方之间建立一条被双方独占的物理通路

随机推荐

  • obsidian加git备份,同时忽略掉自己不想同步的文件夹

    最近想用这个语雀进行知识库的分享 但是这个语雀的会员费太贵了 思来想去还是用 git 比较好 因为这个知识库的内容都是自己的笔记 为了能够访问的更加方便我选择了这个 gitte 而不是 github 我的知识库链接 knowledge 第一
  • 如何在sqlplus执行sql文件

    1 Oracle数据库的sqlplus可以直接执行SQL语句吗 2 SQL Plus中怎么执行多个 sql脚本文件 3 如何在sqlplus执行sql文件 4 怎样在sqlplus中批量执行sql文件 Oracle数据库的sqlplus可以
  • 在模仿中精进数据分析与可视化01——颗粒物浓度时空变化趋势(Mann–Kendall Test)

    本文是在模仿中精进数据分析与可视化系列的第一期 颗粒物浓度时空变化趋势 Mann Kendall Test 主要目的是参考其他作品模仿学习进而提高数据分析与可视化的能力 如果有问题和建议 欢迎在评论区指出 若有其他想要看的作品 也欢迎在评论
  • GIT合并分支的三种方法

    一 使用merge命令合并分支 1 目标 将dev分支合并到master分支 1 1 首先切换到master分支上 git checkout master 1 2 如果是多人开发的话 需要把远程master上的代码pull下来 git pu
  • 【华为OD机试 】 单词搜索(C++ Java JavaScript Python)

    题目描述 找到它是一个小游戏 你需要在一个矩阵中找到给定的单词 假设给定单词 HELLOWORD 在矩阵中只要能找到 H gt E gt L gt L gt O gt W gt O gt R gt L gt D连成的单词 就算通过 注意区分
  • flask 写数据mysql_Flask从入门到精通之MySQL数据库操作

    前面的章节中我们已经学习了如何建立模型和关系 接下来我们学习如何使用模型的最好方法是在Python shell 中实际操作 并将介绍最常用的数据库操作 一 创建表 首先 我们要让Flask SQLAlchemy 根据模型类创建数据库 方法是
  • 27.EI文章复现《高比例清洁能源接入下计及需求响应的配电网重构》

    下载地址 高比例清洁能源接入下计及需求响应的配电网重构 1主要内容 该程序复现 高比例清洁能源接入下计及需求响应的配电网重构 以考虑网损成本 弃风弃光成本和开关操作惩罚成本的综合成本最小为目标 针对配电网重构模型的非凸性 引入中间变量并对其
  • Templates and Classes___CH_19

    19 1 Template classes Templates and container classes Template classes in the standard library Now that we ve covered te
  • 分库分表

    名词解释 库 database 表 table 分库分表 sharding 为什么要分库分表 移动互联网时代 海量的用户每天产生海量的数量 比如 用户表 订单表 交易流水表 以支付宝用户为例 8亿 微信用户更是10亿 订单表更夸张 比如美团
  • Python 20.opencv 直方图均衡化,CLAHE(对比度改变)

    import cv2 import numpy as np img cv2 imread pic1 png 0 进行直方图均衡化 equ cv2 equalizeHist img CLAHE有限对比适应性直方图均衡化 作用 限制对比度下降
  • 第一个项目单个交换机接入网络

    按图片上的要求来将一个交换机接入网络 配置明细路由 vlanif当网关
  • MATLAB中LSTM时序分类的用法与实战

    MATLAB中LSTM时序分类的用法与实战 说明 本教程适用于R2018b版本的matlab 不知道R2018a有没有 但是2017版本的肯定是没有LSTM工具箱的了 所以版本低的趁这个机会卸载然后重新下载安装吧 引用参考 1 matlab
  • 基于昇腾CANN的推理应用开发--语义分割(Python)

    前情提要 基于 Python 开发 通过网络模型加载 推理 结果输出的部署全流程展示 快速熟悉并掌握语义分割基本开发流程 目录 1 内容及目标 1 1 内容 1 2 目标 1 3 先导知识 2 理解原始模型 2 1 网络结构 2 2 查看模
  • stable diffusion model训练遇到的问题【No module named ‘triton‘】

    一天早晨过来 发现昨天还能跑的diffusion代码 突然出现了 No module named triton 的问题 导致本就不富裕的显存和优化速度雪上加霜 因此好好探究了解决方案 首先是原因 由于早晨过来发现 电脑重启 导致了 训练终止
  • 冒泡排序与选择排序区别

    冒泡排序 冒泡排序 BubbleSort 的基本概念是 依次比较相邻的两个数 将小数放在前面 大数放在后面 即在第一趟 首先比较第1个和第2个数 将小数放前 大数 放后 然后比较第2个数和第3个数 将小数放前 大数放后 如此继续 直至比较最
  • LeetCode 热门100题 2.两数相加

    public class Solution public ListNode addTwoNumbers ListNode l1 ListNode l2 int num1 ListToArray l1 int num2 ListToArray
  • 开源创作工具一览

    GIMP 2 8 http www gimp org 常见的位图编辑工具 不再赘述 新的 2 8 版本增加了单窗口模式 层分组等功能 Fedora 17 安装 pkcon install gimp MyPaint http mypaint
  • 简单的数据库关系表建立

    表与表之间一般存在三种关系 即一对一 一对多 多对多关系 下面分别就三种关系讲解数据库相关设计的思路和思考过程 1 一对一关系 例如 下面的一张表 保存了人的相关信息 有男有女 要求查处所有的夫妻 sql代码 CREATE TABLE IF
  • android上架备案公钥和md5获取工具

    最近很多公司上架遇到了一个问题 就是要提供app的备案证明 现在android上架都需要备案了 但是我们的证书都是通过工具生成的 哪里知道公钥和md5那些东西呢 无论安卓备案还是ios备案都需要提供公钥和md5 包括ios的备案也是 找了很
  • uni-app使用swiper实现tab左右滑动下拉无法触发onReachBottom页面生命周期

    注意要点 1 通过uni getSystemInfo获取设备具体高度 定义swiper的高度 将swiper撑开 2 利用scroll view视图容器的 scrolltolower属性实现触底加载 3 点击tab切换也会触发swiper的