uniapp实现区域滚动、下拉刷新、上滑滚动加载更多

news/2024/9/14 17:37:41/ 标签: uni-app

背景:

在uniapp框架中,有两种实现办法。第1种,是首先在page.json中配置页面,然后使用页面的生命周期函数;第2种,使用<scroll-view>组件,然后配置组件的相关参数,包括但不限于:滚动区域、触底加载。。。这里注意要给scroll-view设置一个height不然滚动不了

效果展示:

 

根据开发实际情况,我推荐第2种、第3种解决办法。

一、单个页面的配置

官方链接:点击跳转官网

第一步,是在pages.json配置开启下拉刷新 

{"path": "pages/PMS/document/officialDocument","style": {"navigationStyle": "custom","enablePullDownRefresh": false, //配置后,可以下拉刷新,上拉加载`"onReachBottomDistance": 100}},

就已经成功开启下拉刷新,与触底加载了,当然还需要相对应的事件去触发。接下来就介绍一下所需要的事件函数。

onReachBottom()  (上拉时到底部多少距离触发的事件)    官方语言:页面滚动到底部的事件。可在pages.json里定义具体页面底部的触发距离onReachBottomDistance,比如设为50,那么滚动页面到距离底部50px时,就会触发onReachBottom事件。

uni.startPullDownRefresh() (直接调用一次下拉事件)官方语言:开始下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。

onPullDownRefresh()   (下拉后触发的事件)官方语言:处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事件。

 上滑触底加载:

核心代码:

	onLoad() {},onReachBottom(){//上拉到底时触发,onReachBottom函数跟生命周期同级let  allTotal = this.formData.page * this.formData.pageSizeif(allTotal < this.total){this.page ++;//当前条数小于总条数 则增加请求页数this.getData() //调用加载数据方法}else{console.log('已加载全部数据')}},onPullDownRefresh(){//下拉刷新触发,onPullDownRefresh函数跟生命周期同级this.list = []this.getData()//调用获取数据方法setTimeout(() => {//结束下拉刷新uni.stopPullDownRefresh ();}, 1000);},

加载动态效果:

使用组件:
<uni-load-more :status="status"></uni-load-more>
<script>
export default {data(){status: 'more',page:'1',pageSize:'10'},onLoad() {},onReachBottom() {let allTotal = this.page * this.pageSize;if (allTotal < this.total) {this.status = 'loading';  //加载中状态this.page++;this.getData()} else {this.status = 'noMore'; //加载完状态}},}
</script>

 备注说明:

因为通过验证console.log(),按照设计图来写,滚动区域不一样。不会出发onReachBottom()。推荐第2种解决方式。。。

二、scroll-view组件的滚动区域、触底加载

官网链接:点击跳转官网

 

@refresherpulling  //下拉刷新控件被下拉

@refresherrefresh  //下拉刷新被触发

@refresherrestore  //下拉刷新被复位

@scrolltoupper  //滚动到顶部/左边,会触发 scrolltoupper 事件

@scrolltolower  //滚动到底部/右边,会触发 scrolltolower 事件

核心代码:

<template>
<scroll-viewclass="dialogue-box"style="height: 86vh":scroll-y="true":refresher-threshold="10":scroll-top="scrollTop"@scrolltolower="handelLower":refresher-enabled="isLoadingTop":refresher-triggered="isTriggeredTop"@refresherrefresh="handleRefresher"@refresherrestore="handelonRestore">
</scroll-view>
</template><script>
export default {
data() {return {tableList: [],lazyLoad: true,shipGuid: "",scrollTop: "50px",loadings: "more", //more/loading/noMoreisLoadingTop: true,isTriggeredTop: true,isShowBtm: false,
};
},
method:{getTableList(info, load) {//发起网络请求getFiles(info).then((res) => {if (res.data.code == 0) {const resData = res.data.data;if (load) {this.tableList = this.tableList.concat(resData);if (resData && resData.length == 0) {// console.log("没有更多了");uni.hideLoading();this.loadings = "noMore";} else {uni.hideLoading();this.loadings = "more";}return resData;} else {this.tableList = resData;this.noNum = !this.tableList.length;}}});},handelLower() {console.log("滚动到底部>>>");this.isShowBtm = true;if (this.loadings == "loading") return;if (!this.loadings == "noMore") return;this.loadings = "loading";this.pages.page += 1;let info = {...this.pages,shipGuid: this.shipGuid,};this.getTableList(info, true);},handleRefresher() {console.log("顶部下拉刷新s>>>", this.isLoadingTop, this.isTriggeredTop);this.isLoadingTop = true;this.isTriggeredTop = true;if (!this.isLoadingTop) return;let info = {...this.pages,shipGuid: "",};this.$store.commit("setShipGuids", "");this.getTableList(info);this.isLoadingTop = false;this.isTriggeredTop = false;},handelonRestore() {console.log("handelonRestore>>>");this.isLoadingTop = true;},
},
</script>

备注:

scroll-view组件要设置一个height。一般是设置为(某某vh) 

三、第2种的优化

背景:

第2种已经能够实现下拉刷新和触底加载。但是我们只想要触底加载,并且想让scroll-view组件的高度是自适应的,不再设置 滚动区域的高度scrollHeight

注意:关于高度,通过设置css样式解决,通过给最外层的盒子,设置min-height:0;

 这次使用uniapp+uView组件实现:

效果展示:

代码:

<template><view class="regionalregulation_contanier"><!-- <TopNavibarVue :listData="listData" :currentTabIndex="currentTabIndex" @clickTabs="clickTabs"></TopNavibarVue> --><template v-for="item in listData"><view class="regionalregulation_content" v-if="currentTabIndex == item.id" :key="item.id"><!-- <u-sticky bgColor="#fff"><view style="padding: 20rpx 20rpx 0rpx 20rpx;"><FormItem :formItems="formItems" @searchData="searchData"></FormItem></view></u-sticky> --><view class="content_list" v-if="tableData.length"><scroll-view :scroll-y="true" @scrolltolower="handelLower"><view v-for="i in tableData" :key="i.pid"><CardTopBTNVue :data="i" :detail="{ title: item.subName }"></CardTopBTNVue></view><u-loadmore :status="loadings" v-if="isShowBtm" /></scroll-view></view><view class="content_list" v-else><u-empty mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png" text="暂无匹配信息"></u-empty></view></view></template></view>
</template>
<script>
export default {
data() {return {pages: {pageNum: 1,pageSize: 7,},tableData: [],scrollTop: "50px",loadings: "loadmore", //loadmore/loading/nomoreisShowBtm: false,
}
methods: {async getTableList(params, id, _isLower) {const {data: res} = await this.listData[id].apiPost(params)if (res.code == 0) {const resData = res.dataif (_isLower) {this.tableData = [...this.tableData, ...resData]} else {this.tableData = resData}this.loadings = resData.length < params.pageSize ? "nomore" : "loadmore";} else {this.tableData = []}// this.isShowBtm = false;setTimeout(function () {uni.hideLoading();}, 500);},handelLower() {this.isShowBtm = true;if (this.loadings == "loading") return;if (this.loadings == "nomore") return;this.loadings = "loading";this.pages.pageNum += 1;this.getTableList(this.pages, this.currentTabIndex, true);},
}
</script><style lang="scss" scoped>
.regionalregulation_contanier {width: 100%;height: 100%;display: flex;flex-direction: column;.regionalregulation_content {min-height: 0;flex: 1;display: flex;flex-direction: column;box-sizing: border-box;.content_list {min-height: 0;flex: 1;overflow-y: auto;padding: 0rpx 20rpx;margin-top: 10rpx;box-sizing: border-box;display: flex;flex-direction: column;justify-content: center;align-content: center;box-sizing: border-box;uni-scroll-view {height: 100%;}}}
}
</style>

CSS布局中最小高度的妙用——最小高度可以设定一个BOX的最小高度,当其内容较少时时,也能保持BOX的高度为一定,超出就自动向下延伸 


http://www.ppmy.cn/news/1518871.html

相关文章

Java面试题:equals和==的区别与联系分别是什么?

1. 运算符 是一个运算符&#xff0c;其用于比较两个变量的内存地址是否相等&#xff1b;对于基本数据类型(int、char、Boolean等)&#xff0c;比较的是它们的值&#xff1b;而对于引用数据类型的话(String、Object、ArrayList等)&#xff0c;比较的是引用&#xff0c;也就是对…

Golang | Leetcode Golang题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; func combinationSum4(nums []int, target int) int {dp : make([]int, target1)dp[0] 1for i : 1; i < target; i {for _, num : range nums {if num < i {dp[i] dp[i-num]}}}return dp[target] }

【Kubernetes知识点问答题】第一篇

目录 1.ca-certificates, gnupg, lsb-release 三个包的解释。 2.docker-ce, docker-ce-cli, containerd.io, docker-compose-plugin 作用。 3.K8s 在 1.2 之后就不再支持 docker&#xff0c;请解释对错。 4.举例说明创建容器以及以交互方式访问容器的命令&#xff1f; 1.ca-…

Durid解析SQL语句

在外面的需求中&#xff0c;有很多需要解析SQL语句的地方&#xff0c;我们采用Durid来进行解析。 Durid可以将sql进行详细的拆分成多个部分 解析where解析SQLSelectItem解析update语句解析limit解析group by 还可以动态修改sql&#xff0c;比如在原sql上增加条件修改sql运行的…

libtorch---day03[自定义导数]

参考pytorch。 背景 希望使用勒让德多项式拟合一个周期内的正弦函数。 真值&#xff1a; y s i n ( x ) , x ∈ [ − π , π ] ysin(x),x\in\left[-\pi,\pi\right] ysin(x),x∈[−π,π] torch::Tensor x torch::linspace(-M_PI, M_PI, 2000, torch::kFloat); torch::Ten…

前端配置环境

工具类配置 一、下载Git Bash 下载地址 二、下载google浏览器 下载地址 三、下载微信开发者工具 下载地址 四、下载vscode 下载地址 1、安装中文包 安装中文包 教程 2、安装插件 3、vscode中使用git 教程 4、setting.json 我自己常用的&#xff1a; {"editor.fontSiz…

分布式中间件

1.Nacos 服务注册和服务发现原理图&#xff1a; 1.服务提供方将集群信息注册到Nacos&#xff0c;并定期心跳包提供健康信息&#xff0c;宕机即剔除 2.服务消费方定期拉取订阅信息&#xff0c;获取服务实例列表 3.服务集群的负载均衡是在消费者一方进行选择 负载均衡&#xf…

代理 IP 在工业物联网中的大作用

随着科技的飞速发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为现代工业的重要组成部分&#xff0c;它通过将各种物理设备、传感器、控制系统等通过互联网连接起来&#xff0c;实现了工业生产的智能化、自动化和远程监控。而在这个庞大的网络体系中&#xff0…

【RabbitMQ】快速上手

目 录 一. RabbitMQ 安装二. RabbitMQ 核心概念2.1 Producer 和 Consumer2.2 Connection 和 Channel2.3 Virtual host2.4 Queue2.5 Exchange2.6 RabbitMQ 工作流程 三. AMQP四. web界面操作4.1 用户相关操作4.2 虚拟主机相关操作 五. RabbitMQ 快速入门5.1 引入依赖5.2 编写生产…

C# Default.aspx 中文乱码解决方案

Language: C#(CSharp) IDE: Notepad 程序文件内容一摸一样&#xff0c;后缀改为 Default.aspx 就会乱码&#xff0c;改成 Default.php 或 Default.html 一切正常。 尝试使用服务器端指定编码 Response.ContentType "text/html; charsetutf-8"; 客户端也指定编码 …

vim 修改文件

在 Vim 中修改文件是一个常见的任务。以下是一些基本步骤和命令&#xff0c;帮助你在 Vim 中编辑和保存文件。 打开文件 使用以下命令在终端中打开一个文件&#xff1a; vim filename基本模式 Vim 有三种基本模式&#xff1a; 正常模式&#xff08;Normal mode&#xff09…

Linux 下查找运行中的 Java 进程及 .jar 文件位置

在 Linux 环境中&#xff0c;有时我们需要查找正在运行的 Java 进程以及它们对应的 .jar 文件位置。本文将介绍如何使用命令行工具来实现这一目标。 前言 在 Linux 系统中&#xff0c;我们经常需要监控正在运行的应用程序&#xff0c;特别是在出现问题时&#xff0c;了解应用程…

乐凡三防:工业界的硬核产品——重新定义三防平板的极限

在工业4.0的浪潮中&#xff0c;科技与制造业的深度融合催生了一系列高性能、高耐用的智能产品。乐凡三防平板&#xff0c;作为工业界的新宠&#xff0c;正以其卓越的防护性能和强大的功能&#xff0c;重新定义了三防平板的极限&#xff0c;成为硬核科技的代表。 硬核防护&#…

时空图卷积网络:用于交通流量预测的深度学习框架-1

摘要 准确的交通预测对于城市交通控制和引导至关重要。由于交通流的高度非线性和复杂性&#xff0c;传统方法无法满足中长期预测任务的需求&#xff0c;且往往忽略了空间和时间的依赖关系。本文提出一种新的深度学习框架——时空图卷积网络(STGCN)来解决交通领域的时间序列预测…

在Ubuntu 18.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 MySQL 是一个开源的数据库管理系统&#xff0c;通常作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xf…

discuz Upload Failed.

baidu搜索关键词 NGINX上传文件大小限制 在Nginx中设置文件上传大小限制&#xff0c;你需要修改client_max_body_size指令。默认情况下&#xff0c;该指令的值为1M&#xff0c;意味着上传文件大小不能超过1MB。 打开Nginx配置文件&#xff08;通常是nginx.conf或者位于/etc/…

pyautogui的一些自动化示例,附代码

以下为您提供一些 pyautogui 的自动化示例及代码&#xff1a; 模拟鼠标点击和移动&#xff1a;import pyautogui # 获取屏幕的宽度和高度 screen_width, screen_height pyautogui.size() # 将鼠标移动到屏幕中心 pyautogui.moveTo(screen_width / 2, screen_height / 2) # 在…

Linux的常见指令

前言 Hello,今天我们继续学习Liunx&#xff0c;上期我们简单了解了Linux的基本用处&#xff0c;并了解了Linux的重要性&#xff0c;今天我们就继续更加深入的学习Linux&#xff0c;进行指令方面的学习&#xff0c;我们可以通过先学习简单的基础命令来学习Linux&#xff0c;并在…

css设置让整个盒子的内容渐变透明(非颜色渐变透明)

css设置让整个盒子的内容渐变透明&#xff08;非颜色渐变透明&#xff09; 效果核心css代码 效果 核心css代码 /* 设置蒙版上下左右渐变显示 */ mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%, rgba(0, 0, 0, 1) 90%, rgba(0, 0, 0, 0) 1…

LuaJit分析(一)LuaJit交叉编译

​​​​​​Android 使用ndk版本 r16b 在luajit2.1.0-beta3目录下创建一个脚本文件&#xff0c;armv7编译代码如下&#xff1a; make clean NDKE:/android-ndk-r16b #ndk路径 NDKABI21 NDKTRIPLEarm-linux-androideabi NDKVER$NDK/toolchains/$NDKTRIPLE-4.9 NDKP$NDKVER/…