uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置

提醒
本文实例是使用uniapp进行开发演示的。

一、需求场景

在开发商品(SKU)列表页面时,通常有三个需求:

  1. 页面下拉刷新,第一页展示最新数据;
  2. 上拉加载更多数据;
  3. 列表页面可以滚动到指定位置,例如:回到顶部、回到上次浏览位置

二、需求分析

  1. 接口支持分页加载
  2. 页面下拉刷新
    首先在pages.json页面路由里将enablePullDownRefresh参数值设为true,表示此页面开启下拉刷新;刷新成功后,页面数据更新并回到顶部;
  3. 页面向上滑动时,检测是否有更多数据,加载到新的数据直接显示在当前页面列表数据下方,否则提示用户没有更多数据了;
  4. 记录当前页面滚动的位置;当触发滚动到指定位置方法时将记录页面上次滚动的位置数值参入即可。

三、技术方案

  1. uni-app页面生命周期onPullDownRefresh函数,监听用户下拉动作,一般用于下拉刷新;
  2. uni-app页面生命周期onReachBottom函数,页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项
  3. uni-app页面生命周期onPageScroll函数,监听页面滚动,参数为Object;通过obj.scrollTop获取滚动距离;
  4. uni.pageScrollTo()方法实现页面滚动到指定位置

四、技术知识点简介

4.1 下拉刷新(onPullDownRefresh)

小程序开启下拉刷新,在配置页面(pages.json)的 enablePullDownRefresh 属性为 true。
js代码示例

{"pages": [{"path": "pages/list/testPulldownRefreshReachBottom","style": {"navigationBarTitleText": "产品列表","enablePullDownRefresh": true,"app-plus": {"bounce": "vertical"}}}]
}

在 App 平台下可以自定义部分下拉刷新的配置 page->style->app-plus->pullToRefresh。
js代码示例

{"pages": [{"path": "pages/index/index", //首页"style": {"app-plus": {"pullToRefresh": {"support": true,"color": "#ff3333","style": "default","contentdown": {"caption": "下拉可刷新自定义文本"},"contentover": {"caption": "释放可刷新自定义文本"},"contentrefresh": {"caption": "正在刷新自定义文本"}}}}}]
}

下拉刷新使用注意

  • enablePullDownRefresh 与 pullToRefresh->support 同时设置时,后者优先级较高。
  • 如果期望在 App 和小程序上均开启下拉刷新的话,请配置页面的 enablePullDownRefresh 属性为 true。
  • 若仅期望在 App 上开启下拉刷新,则不要配置页面的 enablePullDownRefresh 属性,而是配置 pullToRefresh->support 为 true。
  • 开启原生下拉刷新时,页面里不应该使用全屏高的scroll-view,向下拖动内容时,会优先触发下拉刷新而不是scroll-view滚动
  • 原生下拉刷新的起始位置在原生导航栏的下方,如果取消原生导航栏,使用自定义导航栏,原生下拉刷新的位置会在屏幕顶部。如果希望在自定义导航栏下方拉动,只能使用circle方式的下拉刷新,并设置offset参数,将circle圈的起始位置调整到自定义导航栏下方。hello uni-app的扩展组件中有示例。
  • 如果想在app端实现更多复杂的下拉刷新,比如美团、京东App那种拉下一个特殊图形,可以使用nvue的组件。HBuilderX 2.0.3+起,新建项目选择新闻模板可以体验
  • 如果想在vue页面通过web前端技术实现下拉刷新,插件市场有例子,但前端下拉刷新的性能不如原生,复杂长列表会很卡
  • iOS上,default模式的下拉刷新和bounce回弹是绑定的,如果设置了bounce:none,会导致无法使用default下拉刷新
4.2 页面滚动到底部的事件(onReachBottom)

可在pages.json里定义具体页面底部的触发距离onReachBottomDistance,

比如设为50,那么滚动页面到距离底部50px时,就会触发onReachBottom事件。

如使用scroll-view导致页面没有滚动,则触底事件不会被触发。scroll-view滚动到底部的事件请参考scroll-view的文档。

onReachBottomDistance 参数说明
onReachBottomDistance:Number类型,默认值 50,页面上拉触底事件触发时距页面底部距离,单位只支持px。

4.3 监听页面滚动(onPageScroll)

参数说明
scrollTop:Number类型,页面在垂直方向已滚动的距离(单位px)
js代码示例

onPageScroll : function(e) { //nvue暂不支持滚动监听,可用bindingx代替console.log("滚动距离为:" + e.scrollTop);
},

监听页面滚动注意

  • onPageScroll里不要写交互复杂的js,比如频繁修改页面。因为这个生命周期是在渲染层触发的,在非h5端,js是在逻辑层执行的,两层之间通信是有损耗的。如果在滚动过程中,频发触发两层之间的数据交换,可能会造成卡顿。(uvue在app端无此限制)
  • 在webview渲染时,比如app-vue、微信小程序、H5中,也可以使用wxs监听滚动,参考;在app-nvue中,可以使用bindingx监听滚动,参考。
  • 如果想实现滚动时标题栏透明渐变,在App和H5下,可在pages.json中配置titleNView下的type为transparent,参考。(uni-app x不支持)
  • 如果需要滚动吸顶固定某些元素,推荐使用css的粘性布局,参考插件市场。插件市场也有其他js实现的吸顶插件,但性能不佳,需要时可自行搜索。(uni-app x可自由在uts中设置固定位置)
4.4 uni.pageScrollTo(OBJECT)

将页面滚动到目标位置。可以指定滚动到具体的scrollTop数值,也可以指定滚动到某个元素的位置

OBJECT参数说明
在这里插入图片描述

五、实例效果图

1.第一页数据
在这里插入图片描述

2.上拉加载更多数据
在这里插入图片描述

3.下拉刷新
在这里插入图片描述

4.页面滑动超过一页显示 回到顶部按钮
在这里插入图片描述

5.上拉加载更多数据后,已经全部加载完了
在这里插入图片描述

6.点击回到顶部按钮后的页面和第一页显示的数据一样

六、实例代码

testPulldownRefreshReachBottom.vue文件代码

<template><view class="content-root"><view class="content-wrap"><view v-if="productList && productList.length > 0"><view class="list-item" v-for="(item, index) in productList" :key="index"><text class="itme-name">{{ item.name }}</text><text class="itme-desc">{{ item.desc }}</text></view></view><view class="no-data" v-else>暂无数据</view><view class="no-more-data" v-if="noMoreData"><text>没有更多数据了</text></view></view><view class="go-top" v-if="showGoToTop" @click="goToTop"><text>回到</text><text>顶部</text></view></view></template>
<script>
export default {data() {return {productType: 1,currentPage: 1,lastPage: 1,lastPostion: 0,pageSize: 30,total: 0,noMoreData: false,productList: [],showGoToTop: false}},onLoad(option) {this.productType = option.productTypethis.getProductList(true)},onPageScroll(e) {this.lastPostion = e.scrollTopconsole.log(`当前滚动位置 this.lastPostion = ${this.lastPostion} , this.showGoToTop = ${this.showGoToTop}`)if (this.lastPostion > 300) {this.showGoToTop = true} else if (this.showGoToTop) {this.showGoToTop = false}},onPullDownRefresh() {this.lastPage = this.currentPagethis.currentPage = 1this.getProductList(true)setTimeout(() => {uni.stopPullDownRefresh()}, 600);},onReachBottom() {if (this.noMoreData) {return}this.lastPage = this.currentPagethis.currentPage++this.getProductList(false)},methods: {//回到顶部goToTop() {uni.pageScrollTo({scrollTop: 0,duration: 0,})},//获取商品列表async getProductList(refresh) {//let result =  await getProductList() // 网络请求setTimeout(() => {// 模拟网络请求if (refresh) {this.iniLocalData()return}this.loadMoreData()}, 500);},iniLocalData() {this.noMoreData = falsethis.productList = [{productId: "1234567890",name: "西蓝花",desc: "有机蔬菜,安全健康",skuType: [{id: "1",price: "9.99",txt: ""}]},{productId: "3234567890",name: "西红柿",desc: "有机蔬菜,安全健康;",skuType: [{id: "1",price: "9.00",txt: ""}]},{productId: "4234567890",name: "洋葱",desc: "洋葱可生吃,安全健康;",skuType: [{id: "1",price: "5.00",txt: ""}]},{productId: "1734567890",name: "小青菜",desc: "有机蔬菜,安全健康;",skuType: [{id: "1",price: "3.00",txt: ""}]},{productId: "1234467890",name: "上海青",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "3.00",txt: ""}]},{productId: "1234567390",name: "上海青",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "3.00",txt: ""}]},{productId: "1239567390",name: "娃娃菜",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "8.00",txt: ""}]},{productId: "1239567390",name: "胡萝卜",desc: "有机蔬菜,安全健康;",skuType: [{id: "1",price: "5.00",txt: ""}]},{productId: "1239567390",name: "西葫芦",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "8.00",txt: ""}]},{productId: "1239567390",name: "紫甘蓝",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "5.00",txt: ""}]},{productId: "1239567390",name: "大白菜",desc: "蔬菜,安全健康;",skuType: [{id: "1",price: "3.00",txt: ""}]}]},loadMoreData() {if (this.noMoreData) {return}let result = [{productId: "2239567390",name: "牛腱",desc: "新鲜牛肉;",skuType: [{id: "1",price: "109.00",txt: ""}]},{productId: "2239567391",name: "牛腿肉",desc: "新鲜牛肉;",skuType: [{id: "1",price: "99.00",txt: ""}]},{productId: "2239567392",name: "牛腩",desc: "新鲜牛肉;",skuType: [{id: "1",price: "89.00",txt: ""}]},{productId: "2339567390",name: "排骨",desc: "新鲜猪肉;",skuType: [{id: "1",price: "29.00",txt: ""}]},{productId: "2339567391",name: "后退肉",desc: "新鲜猪肉;",skuType: [{id: "1",price: "18.00",txt: ""}]},{productId: "2339567390",name: "五花肉",desc: "新鲜猪肉;",skuType: [{id: "1",price: "24.00",txt: ""}]}]this.productList = [...this.productList, ...result]this.noMoreData = true // 这个逻辑在实际项目开发中以接口返回的总数量为准}}}
</script><style scoped>
.content-root {height: 100%;background-color: #f5f5f5;padding: 32rpx;
}.content-wrap {background-color: #f5f5f5;padding-bottom: 80rpx;
}.list-item {display: flex;padding: 16rpx 20rpx;flex-direction: column;background-color: #ffffff;border-radius: 16rpx;color: #000;margin-bottom: 32rpx;
}.itme-name {font-size: 32rpx;
}.itme-desc {font-size: 24rpx;
}.no-data {height: 100%;text-align: center;margin-top: 400rpx;color: #000;font-size: 28rpx;
}.no-more-data {width: 100%;height: 50rpx;color: #000;align-items: center;font-size: 28rpx;font-family: PingFangSC-Medium, PingFang SC;text-align: center;
}.go-top {z-index: 99;position: fixed;display: flex;flex-flow: column;right: 0;bottom: 0;margin-right: 32rpx;margin-bottom: 200rpx;width: 80rpx;height: 80rpx;align-items: center;background-color: #eeeeee;border-radius: 50%;font-size: 20rpx;font-family: PingFangSC-Medium, PingFang SC;text-align: center;
}
</style>

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

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

相关文章

Liunx权限概念及权限管理

目录 一&#xff1a;shell命令以及运行原理 二&#xff1a;Linux权限的概念 三&#xff1a;Linux的权限管理 3.1文件访问者的分类 3.2文件类型和访问权限&#xff08;事物属性&#xff09; 3.3文件权限的表达方式&#xff1a; 3.4文件访问权限的相关设置方法 四&…

前沿技术与未来发展第一节:C++与机器学习

第六章&#xff1a;前沿技术与未来发展 第一节&#xff1a;C与机器学习 1. C在机器学习中的应用场景 C在机器学习中的应用优势主要体现在高效的内存管理、强大的计算能力和接近底层硬件的灵活性等方面。以下是 C 在机器学习领域的几个主要应用场景&#xff1a; 1.1 深度学习…

Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文# 1、计算属性 computed 在 Vue.js 中&#xff0c;计算属性&#xff08;computed properties&#xff09;是一种特殊的响应式属性&#xff0c;它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。 (1)、基本用法…

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt+7

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt7 idea的结构Structure窗口相当于Eclipse的outline 快捷键是: Alt7 或者点击左上角主菜单面包屑,打开主菜单 然后菜单找到-视图&#xff08;View&#xff09;→ 工具窗口&#xff08;Tool Windows&…

基于大数据 Python+Vue 酒店爬取可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…

FineReport 分栏报表

将报表中的数据根据所需要的展示的样式将数据进行分栏展示列分栏 报表中数据是横向扩展的,超过一页的数据会显示在下一页,而每页下面会有很大的一片空白区域,不美观且浪费纸张。希望在一页中第一行扩展满后自动到下一行继续扩展 1、新建数据集 SELECT * FROM 公司股票2、内…

前端代码分享--爱心

给对象写的&#xff0c;顺便源码给大家分享一下 就是简单的htmlcssjs&#xff0c;不复杂 xin1.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>写你自己的</title> <lin…

深入解析机器学习算法

深入解析机器学习算法 机器学习已经成为当今技术进步的核心推动力量&#xff0c;推动了众多行业的创新。其背后依赖的是各种各样的算法&#xff0c;帮助计算机通过从数据中学习来完成任务。这篇文章将对常见的几类机器学习算法进行深入探讨&#xff0c;帮助你理解其工作原理、…

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…

qt 滚动条 美化

qt QScrollBar 滚动条分为竖直与水平滚动条&#xff0c;两者设置上类似&#xff0c;但也有一些不同&#xff0c;下面主要讲述美化及注意事项。 一、竖直滚动条 竖直滚动条分为7个部分&#xff1a; sub-line、 up-arrow 、sub-page、 hanle、 add-line、 dow-arrow、 add-pag…

猴子请来的补丁——Python中的Monkey Patching

猴子补丁&#xff08;Monkey Patching&#xff09;在Python中是一种允许在运行时修改对象行为的技术。这种技术可以在不直接修改原始源代码的情况下&#xff0c;动态地改变或扩展程序的行为。 猴子补丁的原理 猴子补丁的核心原理是利用Python的动态特性&#xff0c;即在运行时…

研究生论文学习记录

文献检索 检索论文的网站 知网&#xff1a;找论文&#xff0c;寻找创新点paperswithcode &#xff1a;这个网站可以直接找到源代码 直接再谷歌学术搜索 格式&#xff1a;”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文&#xff0c;可以使用以下几种方法&#…

Java并发学习总结:原子操作类

本文是学习尚硅谷周阳老师《JUC并发编程》的总结&#xff08;文末有链接&#xff09;。 基本类型原子类 AtomicIntegerAtomicLongAtomicBoolean AtomicInteger 的方法 getAndIncrement 和 incrementAndGet 的区别&#xff1a; 两个方法都能实现对当前值加 1 &#xff0c; 但…

web服务实验

http实验 先创建需要访问的web页面文件index.html 编辑vim /etc/nginx/conf.d/testip.conf 测试通过域名访问需要编辑/etc/hosts 如果通过windows的浏览器访问需要编辑下面的文件通过一管理员身份打开的记事本编辑 C:\Windows\System32\drivers\etc下的hosts文件 192.168.1…

软考:GPU算力,AI芯片

算力 FLOPS&#xff08;每秒浮点操作&#xff09; NVIDIA 去年就有超过 1 exa 的新闻&#xff0c;所以这个数值是越大越好。 AI芯片的技术架构类型 GPU&#xff1a;图形处理单元&#xff0c;擅长并行处理&#xff0c;适用于深度学习等AI计算密集型任务。FPGA&#xff1a;现…

OpenStack将运行的系统导出 QCOW2 镜像并导入阿里云

项目背景 OpenStack&#xff0c;作为一个开源的云计算平台&#xff0c;经常被用于构建私有云和公有云服务。然而&#xff0c;随着业务的发展和扩展&#xff0c;企业可能会面临将在OpenStack上运行的虚拟机迁移到其他云服务供应商的需求 需求 因为运营团队在本地机房有一台 O…

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务&#xff0c;需要使用TCP协议&#xff0c;我这边负责服务端。客户端是某个设备&#xff0c;客户端传参格式、包头包尾等都是固定的&#xff0c;不可改变&#xff0c;而且还有个蓝牙传感器&#xff0c;透传数据到这个设备&#xff0c;然后通过这个设备…

pandas快速入门

pandas快速入门 1. 创建pandas对象1.1 前言1.2 使用DataFrame类创建pandas对象1.3 对DataFrame对象进行索引1.4 使用Series类创建pandas对象1.5 对DataFrame Series对象使用常见方法 2. pandas读取文件2.1 使用pd.read_*方法读取文件2.2 使用to_*保存数据2.3 使用info()方法查看…

Python 判断键是否存在字典中(新手入门、实战案例)

在早期的Python2版本中&#xff0c;可以使用 dict.has_key()方法来判断一个键是否存在于字典中。 在Python3中&#xff0c;dict.has_key()方法被废弃了&#xff0c;不能再被使用。如果在Python3中尝试使用dict.has_key()方法会导致 AttributeError异常。 那在Python3中要如何判…

Linux:指令再认识

文章目录 前言一、知识点1. Linux下一切皆文件&#xff0c;也就是说显示器也是一种文件2. 指令是什么&#xff1f;3. ll 与 ls -l4. 日志5. 管道6. 时间戳 二、基本指令1. man指令2. cp指令3. mv指令4. 查看文件1&#xff09;cat/tac指令——看小文件2&#xff09;more/less指令…