vue3.0 + vant实现下拉刷新上拉加载

在vue中使用vant组件库有个van-pull-refresh下拉组件,配合van-list列表组件实现页面的下拉刷新和上拉加载,原理简单,适用场景在列表页面内容展示。

下拉刷新

PullRefresh 实现下拉刷新的效果。
PullRefresh组件中的searchRefreshing属性,是下拉刷新时专用的,值有两个true/false;
searchRefreshing设置为true,表示下拉刷新完毕,列表顶部的"加载中…"会隐藏;
searchRefreshing设置为false,表示正在下拉刷新,列表顶部的"加载中…"会显示
参数说明

参数说明类型默认值
v-model是否处于加载中状态boolean-
pulling-text下拉过程提示文案string下拉即可刷新…
loosing-text释放过程提示文案string释放即可刷新…
loading-text加载过程提示文案string加载中…
success-text刷新成功提示文案string-
success-duration刷新成功提示展示时长(ms)number或 string500
animation-duration动画时长number或 string300
head-height顶部内容高度number 或 string50
pull-distance触发下拉刷新的距离number 或 string与 head-height 一致
disabled指是否禁用下拉刷新booleanfalse

事件说明

事件名说明回调参数
refresh下拉刷新时触发-
change拖动时或状态改变时触发{ status: string, distance: number }

插槽说明

名称说明参数
default自定义内容-
normal非下拉状态时顶部内容-
pulling下拉过程中顶部内容{ distance: number }
loosing释放过程中顶部内容{ distance: number }
loading加载过程中顶部内容{ distance: number }
success刷新成功提示内容-

上拉加载

List 组件实现上拉加载的效果
List通过loading和finished两个变量控制加载状态,当组件滚动到底部时,会触发load事件并将loading设置成true。此时可以发起异步操作并更新数据,数据更新完毕后,将loading设置成false即可。若数据已全部加载完毕,则直接将finished设置成true即可。
注意事项:

  • v-model : 是否处于加载状态,加载过程中不触发load事件
  • finished: 是否已加载完成,加载完成后不再触发load事件
  • offset : 滚动条与底部距离小于 offset 时触发load事件
  • loading-text加载过程中的提示文字
  • finished-text加载完成后的提示文字

List有以下三种状态,理解这些状态有助于你正确地使用List组件:

  1. 非加载中,loading为false,此时会根据列表滚动位置判断是否触发load事件(列表内容不足一屏幕时,会直接触发)
  2. 加载中,loading为true,表示正在发送异步请求,此时不会触发load事件
  3. 加载完成,finished为true,此时不会触发load事件

在每次请求完毕后,需要手动将loading设置为false,表示加载结束
事件使用:@load方法
滚动条与底部距离小于 offset 时触发
属性说明

参数说明类型默认值
v-model:loading是否处于加载状态,加载过程中不触发 load 事件booleanfalse
v-model:error是否加载失败,加载失败后点击错误提示可以重新触发 load 事件booleanfalse
finished是否已加载完成,加载完成后不再触发 load 事件booleanfalse
offset滚动条与底部距离小于 offset 时触发 load 事件number& string300
loading-text加载过程中的提示文案string加载中…
finished-text加载完成后的提示文案string-
error-text加载失败后的提示文案string-
immediate-check是否在初始化时立即执行滚动位置检查booleantrue
disabled是否禁用滚动加载booleanfalse
direction滚动触发加载的方向,可选值为 upstringdown
scroller v4.6.4指定需要监听滚动事件的节点,默认为最近的父级滚动节点Element-

事件

事件名说明回调参数
load滚动条与底部距离小于 offset 时触发-

方法

方法名说明参数返回值
check检查当前的滚动位置,若已滚动至底部,则会触发 load 事件--

完整代码示例

<template><div><div v-if="listArr.length > 0"><PullRefresh v-model="isLoading" @refresh="handleRefresh"><Listv-model:loading="loading":finished="finishedStatus":offset="80"finished-text="没有更多了"@load="handleLoad"error-text="请求失败,点击重新加载":scroller="scrollerBody":immediate-check="false"><CellGroup v-for="item in listArr" style="margin-bottom: 10px" :key="item.id" inset border><Cell><template #title><span class="custom-title">条码号:&nbsp;</span><span>{{ item.packageCode }}</span></template></Cell><div class="contentDesc"><div class="entryDesc"><span>需求来源:</span><span>{{ item.receiveCode }}</span></div><div class="entryDesc"><span>激活状态:</span><span>{{ item.printStatus_dictText }}</span></div><div class="entryDesc"><span>单号:</span><span>{{ item.skuCode }}</span></div><div class="entryDesc"><span>打印日期:</span><span>{{ item.printDate }}</span></div></div></CellGroup></List></PullRefresh></div></div>
</template>
<script lang="ts">import { defineComponent, ref, onMounted, computed, reactive, toRefs } from 'vue';import { Icon, Divider, Row, Cell, CellGroup, Dialog, Button, Picker, Field, Calendar, Form, PullRefresh, List, Popup } from 'vant';import 'vant/lib/index.css';import { PrintCode, PagePrintCode } from './print.data';import { QrCode } from '/@/components/Qrcode/index';import { useRouter, useRoute } from 'vue-router';import { list } from '/@/views/wcs/PrintCodeList/PrintCode.api';export default defineComponent({// 若需要开启页面缓存,请将此参数跟菜单名保持一致name: 'LargePackageCode',components: {Icon,Divider,Cell,CellGroup,Picker,Calendar,Field,Form,Button,PullRefresh,List,Dialog,QrCode,Popup,Row,},setup() {const { replace } = useRouter();const route = useRoute();let isLoading = ref<boolean>(false);let loading = ref<boolean>(false);let finishedStatus = ref<boolean>(false);let listArr = ref<PrintCode[]>([{}]);let pageNo = ref<number>(1);let pageSize = ref<number>(10);let totalItems = ref<number>(0);let showDialog = ref(false);const state = reactive({receiveCode: '',});onMounted(() => {listArr.value = [];getInfo('');});const scrollerBody = computed(() => {return document.body;});async function getInfo(status) {let data: PagePrintCode = await list({pushDate: '', //	推送日期	query	falsereceiveCode: state.receiveCode, //	收货单号	query	falsestatus: status, //	状态pageNo: pageNo.value, //	pageNo,示例值(1)	query	falsepageSize: pageSize.value, //	pageSize,示例值(10)	query	falsecolumn: 'createTime',order: 'desc',});totalItems.value = data.total as 0;let arr = data.records as [];listArr.value = listArr.value.concat(arr);loading.value = false;const num = listArr.value.length - totalItems.value;if (num >= 0) {finishedStatus.value = true;}}async function handleRefresh() {pageNo.value = 1;isLoading.value = false;await getInfo('');// 清空列表数据finishedStatus.value = false;}function handleLoad() {// loading.value = true;setTimeout(() => {if (isLoading.value) {listArr.value = [];isLoading.value = false;}// 数据全部加载完成pageNo.value++;getInfo('');});}return {...toRefs(state),listArr,totalItems,isLoading,loading,finishedStatus,showDialog,handleRefresh,handleLoad,scrollerBody,};},});
</script>
<style lang="less" scoped>.contentDesc {padding: 10px 16px;color: #969799;.entryDesc {display: flex;justify-content: space-between;padding: 2px;align-items: center;}}
</style>

bug

在@load事件不生效,在滚动的过程中,onLoad事件没有任何反应,项目中vant版本 “vant”: “^4.9.1”
在这里插入图片描述
若不设置要设置父元素css属性 style=“{height: 100vh; over; overflow-y: scroll;}”,但是这样设置会有2个滚动条,一个是List父元素的,一个是body的,很难看
在这里插入图片描述
这个时候就考虑scroller属性,指定需要监听滚动事件的节点到body元素上,这时就会只出现一个滚动条,onLoad事件也触发了。

// template 中设置
<Listv-model:loading="loading":finished="finishedStatus":offset="80"finished-text="没有更多了"@load="handleLoad"error-text="请求失败,点击重新加载":scroller="scrollerBody":immediate-check="false" >// :immediate-check="false"  设置首次不加载....</List>
//  ts中设置const scrollerBody = computed(() => {return document.body;});

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

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

相关文章

51单片机嵌入式开发:STC89C52环境配置到点亮LED

STC89C52环境配置到点亮LED 1 环境配置1.1 硬件环境1.2 编译环境1.3 烧录环境 2 工程配置2.1 工程框架2.2 工程创建2.3 参数配置 3 点亮一个LED3.1 原理图解读3.2 代码配置3.3 演示 4 总结 1 环境配置 1.1 硬件环境 硬件环境采用“华晴电子”的MINIEL-89C开发板&#xff0c;这…

安卓app开发-基础-本地环境安装android studio且配置参数

安卓app开发-基础-本地环境安装android studio且配置参数&#xff01;今天为大家介绍一下&#xff0c;如何在自己本地电脑安装android ,studio和启动一个简单的java版本的项目。 第一步&#xff0c;去下面的地址&#xff0c;下载一个安装文件。 地址&#xff1a;AndroidDevToo…

root密码忘了怎么办(从系统引导过程解决)

目录 1.Linux系统密码忘记 2.系统引导过程 2.1 systemd 2.2 GRUB和GRUB2 2.3 运行级别 3.修复MBR扇区故障和GRUB引导故障 3.1 MBR扇区故障 3.2 GRUB引导故障 1.Linux系统密码忘记 我们在生活中经常遇到这类困扰&#xff0c;就是某个账号还是账户密码忘了&#xff0c;这…

第十八章 条件语句(Python)

文章目录 前言一、if 和 else 语句一、if、elif 和 else 多重条件判断语句三、if 语句嵌套 前言 Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 一、if 和 else 语句 语法格式如下&#xff1a;if 要判断的条件…

Docker的理解

Docker的理解 Docker为什么用Docker&#xff1f;1.提升系统资源利用率2.更快速的交付和部署3.高效的部署和扩容4.更简单的管理 Docker核心技术Docker镜像Docker容器Docker仓库 Docker实现原理Linux NamespaceCgroupUnion FS Docker的应用场景1.微服务架构2.持续集成3.快速部署和…

职场内部协同困难?揭秘企业内部沟通问题的根源与解决方案!

在现代职场中&#xff0c;内部协同是非常重要的一环。良好的内部协同可以提高团队的效率和凝聚力&#xff0c;但是在实际工作中&#xff0c;很多企业都会面临内部沟通问题&#xff0c;导致协同困难。那么&#xff0c;企业内部沟通问题的根源是什么&#xff1f;又该如何解决呢&a…

DP V2.1a标准学习

一、说明 DP是DisplayPort的简写,是视频电子标准协会(VESA)标准化的数字式视频接口标准,可用于板内芯片之间的连接,也可用于输出接口连接外部设备。DisplayPort是一种基于数据包的可扩展协议,用于传输视频和音频数据。DisplayPort 具有高度可扩展性,并具有保持向后兼容…

【一步一步了解Java系列】:对这个系列的总结以及对缺漏内部类知识的补充

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 br />个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xf…

文件中插入数据(指定内容数据上传,下载,,和本地文件同名)

文件中要插入数据,还需要保持原来的格式可以覆盖,但是不能忽略插入以后的数据?最近客户有这样的一个需求,本来我们的文件读取是以二进制流的方式读取和写入的,客户变更了方法,我们该如何解决呢?数据文件还需要上传,下载,命名都和原来文件一致. 为了解决这个问题,我们需要解决…

《昇思25天学习打卡营第27天 | 昇思MindSporeShuffleNet图像分类》

27天 本节学习了ShuffleNet图像分类 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;模型的设计目标就是利用有限的计算资源来达到最好的模型精度。设计核心是引入了两种操作&#xff1a;Pointwis…

【Python机器学习】模型评估与改进——分组交叉验证

分组交叉验证是非常常见的一种交叉验证策略&#xff0c;它适用于数据中的分组高度相关时。比如我们想构建一个从人脸图片中识别情感的系统&#xff0c;并且收集了100个人的照片的数据集&#xff0c;其中每个人都进行了多次拍摄&#xff0c;分别展示了不同的情感。我们的目标是构…

报错记录:在特定的conda环境中,打开Jupyter Notebook时遇到模块导入错误,但在终端中输入python并导入模块没有问题

在特定的conda环境中&#xff0c;打开Jupyter Notebook时遇到模块导入错误&#xff08;例如&#xff1a;ModuleNotFoundError: No module named XXX&#xff09;&#xff0c;但在终端中输入python并导入模块没有问题&#xff0c;这通常是因为Jupyter Notebook没有正确使用你激活…

使用gradle上传maven工件到新版maven central仓库central.sonatype.com

本文主要用到的插件是sonatype-uploader, 该插件主要功能是上传依赖文件夹到中央仓库。 该文件夹的生成也十分简单&#xff0c;不用担心。 前言 最近在研究maven插件的时候发现发布的网站发生了变化&#xff0c;使用之前的一些插件没能满足我发布依赖的需求&#xff0c;也可…

数据结构与算法笔记:实战篇 - 剖析Redis常用数据类型对应的数据结构

概述 从本章开始&#xff0c;就进入实战篇的部分。这部分主要通过一些开源醒目、经典系统&#xff0c;真枪实弹地教你&#xff0c;如何将数据结构和算法应用到项目中。所以这部分的内容&#xff0c;更多的是知识点的回顾&#xff0c;相对于基础篇和高级篇&#xff0c;其实这部…

fastapi swagger在线接口文档报错

fastapi swagger在线接口文档报错 1、报错信息 Unable to render this definition The provided definition does not specify a valid version field. Please indicate a valid Swagger or OpenAPI version field. Supported version fields are swagger: “2.0” and those …

【收藏】SaaS运营方法论:寻找合适的合作伙伴的四大方法

一、使用关键字研究工具查找您所在行业的相关博客、频道和网站 但是&#xff0c;根据你的业务规模和性质&#xff0c;如果你需要主动出击寻找合适的推广伙伴&#xff0c;而不仅限于让潜在合作伙伴找你&#xff0c;你可以使用关键字研究工具。 实话实说&#xff0c;最好的联盟营…

QT QML 界面设计教程17——滑动条样式

MySlider.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.impl 2.12 import QtQuick.Templates 2.12 as Template1Template1.Slider {id: controlproperty bool acceptWheel: true //滚轮滑动 property color handleBorderColor: " li…

告别手工录入,企业财务凭证同步迈入智能新时代!

一、客户介绍 某金融租赁股份有限公司作为一家领先的金融租赁企业&#xff0c;一直秉持着创新驱动、服务至上的经营理念。随着业务的快速发展&#xff0c;该公司在财务管理和凭证管理方面遇到了新的挑战。为了更好地提升工作效率&#xff0c;降低运营成本&#xff0c;该公司决…

Spring两大核心思想 IoC和AoP

目录 ✨ 一、什么是IoC 1、定义 &#x1f38a; 2、IoC思想 &#x1f38a; 3、优势 &#x1f38a; 4、对象的管理 &#x1f38a; 存对象&#xff1a;Component 取对象&#xff1a;AutoWired ✨二、什么是DI 1、定义 &#x1f38a; 2、IoC和DI的关系&#x1f38a; 可…

嵌入式Linux系统编程 — 5.7 Linux系统中proc文件系统

目录​​​​​​​ 1 proc文件系统简介 2 proc 文件系统的使用 2.1 使用 cat 命令读取 2.2 使用 read()函数读取 1 proc文件系统简介 /proc 文件系统&#xff0c;也称为进程信息文件系统&#xff08;Process Information file system&#xff09;&#xff0c;是一种在 Li…