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;这…

Docker的理解

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

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;分别展示了不同的情感。我们的目标是构…

使用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;最好的联盟营…

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

一、客户介绍 某金融租赁股份有限公司作为一家领先的金融租赁企业&#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…

Windows电脑自建我的世界MC服务器并与好友远程联机游戏教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

08:结构体

结构体 1、为什么需要结构体2、如何定义结构体3、怎么使用结构体变量3.1、赋值和初始化3.2、结构体变量的输出 1、为什么需要结构体 为了表示一些复杂的事物&#xff0c;而普通的基本类型无法满足实际要求。什么叫结构体 把一些基本类型数据组合在一起形成的一个新的数据类型&…

高性能全局内存池

什么时候使用高性能全局内存池&#xff1f; 1.高并发下有些资源需要被频繁创建和销毁&#xff0c;我们都知道系统调用是很消耗资源的。因此&#xff0c;内存池是一块申请好的资源放在缓存里。 2.频繁使用时增加了系统内存的碎片&#xff0c;降低内存使用效率。内存分配必须起…

11083 旅游背包(优先做)

这个问题可以使用动态规划来解决。我们可以定义一个三维数组dp&#xff0c;其中dp[i][j][k]表示前i种物品&#xff0c;总体积不超过j&#xff0c;总重量不超过k的最大价值。 我们可以使用四重循环来填充这个数组。外层循环遍历所有的物品&#xff0c;第二层循环遍历所有可能的…

2024软件设计师笔记之考点版(一考就过):考试前一天 考点记忆版

软件设计师之一考就过&#xff1a;成绩版 1、栈区&#xff1a;函数调用和返回&#xff0c;由系统控制&#xff1b;存非静态局部变量&#xff1b;用栈实现嵌套调用&#xff08;递归调用&#xff09;&#xff0c;逆波兰式业绩也叫后缀式&#xff0c;用栈进行求值 2、堆区&#x…