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.productType
        this.getProductList(true)
    },

    onPageScroll(e) {
        this.lastPostion = e.scrollTop
        console.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.currentPage
        this.currentPage = 1
        this.getProductList(true)
        setTimeout(() => {
            uni.stopPullDownRefresh()
        }, 600);
    },

    onReachBottom() {
        if (this.noMoreData) {
            return
        }
        this.lastPage = this.currentPage
        this.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 = false
            this.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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何为工业未来赋能?通过CodeMeter为工业企业开辟工业自动化安全与灵活性之道

在现代工业自动化领域&#xff0c;数字化转型已经成为不可逆的趋势。然而&#xff0c;要将新一代的自动化软件与传统设备集成&#xff0c;企业面临的不仅是技术上的复杂性&#xff0c;更是如何有效保护宝贵的知识产权并实现灵活管理的严峻挑战。菲尼克斯电气&#xff08;Phoeni…

HTML5教程(一)- 网页与开发工具

1. 什么是网页 网页 基于浏览器阅读的应用程序&#xff0c;是数据&#xff08;文本、图像、视频、声音、链接等&#xff09;展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…

C语言 动态数据结构的C语言实现单向链表-2

建立一个单向链表 在单向链表中查找节点---查找尾节点 在单向链表中查找节点 --- 查找第 n 个节点 向单向链表中插入一个节点 向单向链表的尾部插入一个节点 向单向链表中某节点后插入一个节点 向单向链表中插入一个节点 删除单向链表中的某一节点 链表 vs 数组 动态数据结构

C++核心编程和桌面应用开发 第十五天(deque/stack/queue)

目录 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; 1.2大小操作 1.3插入和删除 1.5数据存取 1.6排序&#xff08;升序&#xff09; 2.stack容器 3.queue容器 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; deque内部工作原理&a…

湖北省自闭症全托管:为您推荐湖北省的自闭症服务机构

原文指路&#xff1a;http://www.zibizhengwang.com/page35.html 自闭症&#xff0c;这一复杂而神秘的神经发育障碍&#xff0c;长久以来困扰着无数家庭。它不仅影响着儿童的社交互动、沟通能力&#xff0c;还常常伴随着行为问题和感官过敏。面对这一挑战&#xff0c;湖北省内…

HTML静态网页作业成品(HTML+CSS)——动漫犬夜叉主题网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码1、HTML代码2、CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用DIVCSS布局&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二…

使用Python来下一场深夜雪

效果图&#xff1a;&#xff08;真实情况是动态的&#xff09; 完整代码&#xff1a; import turtle import random# 初始化画布 turtle.bgcolor("#001f3f") # 偏深蓝色的背景 turtle.title("下雪的画面") turtle.speed(0) turtle.hideturtle() turtle.t…

ffmpeg视频滤镜:定向模糊-dblur

滤镜简述 dblur 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#dblur 有一个模糊滤镜&#xff0c;我试了一下&#xff0c;没有感觉到它的特殊之处, 这里简单介绍一下。 滤镜使用 滤镜的参数 angle <float> ..FV.....T. set angle (from 0 t…

基于neo4j的旅游知识图谱维护与问答系统

你还在为毕业设计发愁吗&#xff1f;试试这个基于Neo4j的旅游知识图谱维护与问答系统吧&#xff01;这套系统不仅功能强大&#xff0c;而且几乎涵盖了你需要的一切&#xff0c;完美助力你的毕业项目&#xff01; 系统介绍 该系统是专门针对旅游景点信息的知识图谱工具&#x…

ClickHouse在百度MEG数据中台的落地和优化

导读 百度MEG上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统&#xff0c;包括Turing Data Engine(TDE)计算引擎、Turing Dat…

常用排序算法总结

内容目录 1. 选择类排序 1.1 直接选择排序1.2 堆排序 2. 交换类排序 2.1 冒泡排序2.2 快速排序 3. 插入类排序 3.1 直接插入排序3.2 希尔排序 4. 其它排序 4.1 归并排序4.2 基数排序/桶排序 排序 1. 选择类排序 选择类排序的特征是每次从待排序集合中选择出一个最大值或者最…

大数据治理平台建设规划方案(71页WORD)

随着信息化时代的到来&#xff0c;大数据已成为企业管理和决策的重要基础。然而&#xff0c;大数据的快速增长和复杂性给数据的管理和治理带来了巨大挑战。为了有效应对这些挑战&#xff0c;构建一个高效、稳定的大数据治理平台显得尤为重要。 文档介绍&#xff1a; 该平台旨在…

零基础Java第十期:类和对象(一)

目录 一、拜访对象村 1.1. 什么是面向对象 1.2. 面向对象与面向过程 二、类定义和使用 2.1. 类的定义格式 2.2. 类的定义练习 三、类的实例化 3.1. 什么是实例化 3.2. 类和对象的说明 四、this引用 4.1. 什么是this引用 4.2. this引用的特性 一、拜访对象村 在…

基于SSM考研助手系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教学秘书管理&#xff0c;考研资讯管理&#xff0c;考研名师管理&#xff0c;考研信息管理&#xff0c;系统管理 教学秘书账号功能包括&#xff1a;系统首页&#xff0c;个人中心…

让你的 IDEA 使用更流畅 | IDEA内存修改

随着idea使用越来越频繁&#xff0c;笔者最近发现使用过程中有时候会出现卡顿现象&#xff0c;例如&#xff0c;启动软件变慢&#xff0c;打开项目的速度变慢等&#xff1a; 因此如果各位朋友觉得最近也遇到了同样的困惑&#xff0c;不妨跟着笔者一起来设置IDEA的内存大小吧~ …

基于Bert+Attention+LSTM智能校园知识图谱问答推荐系统

获取更多完整项目代码数据集&#xff0c;点此加入免费社区群 &#xff1a; 首页-置顶必看 1. 项目简介 本项目旨在实现基于ALBERT模型的命名实体识别&#xff08;NER&#xff09;任务。ALBERT&#xff08;A Lite BERT&#xff09;是谷歌提出的轻量级BERT模型&#xff0c;具有…

贪心算法与盛雨水问题

啥是盛雨水问题&#xff1f;给个图就熟悉了 欸&#xff1f; 这其中的关键在于&#xff1a; 1. 容量2D化就是长 * 宽 2. 木桶效应&#xff1a;宽取决于短板。 那我们来分析&#xff0c;怎么样能达到最佳的结果呢&#xff1f;穷举一下所有可能性不就好了&#xff1f;每两个板子…

ArcGIS001:ArcGIS10.2安装教程

摘要&#xff1a;本文详细介绍arcgis10.2的安装、破解、汉化过程。 一、软件下载 安装包链接&#xff1a;https://pan.baidu.com/s/1T3UJ7t_ELZ73TH2wGOcfpg?pwd08zk 提取码&#xff1a;08zk 二、安装NET Framework 3.5 双击打开控制面板&#xff0c;点击【卸载程序】&…

【c++篇】:解析c++类--优化编程的关键所在(二)

文章目录 一.默认成员函数二.构造函数2.1.构造函数的概念2.2构造函数的特性 三.析构函数3.1析构函数的概念3.2析构函数的特性 四.拷贝构造函数4.1拷贝构造函数的概念4.2拷贝构造函数的特性 五. 赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载 六.const成员七.…