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">
        <List
          v-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	false
          receiveCode: state.receiveCode, //	收货单号	query	false
          status: status, //	状态
          pageNo: pageNo.value, //	pageNo,示例值(1)	query	false
          pageSize: pageSize.value, //	pageSize,示例值(10)	query	false
          column: '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 中设置
<List
   v-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.mfbz.cn/a/761961.html

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

相关文章

echarts 图例有数值但是柱子不显示问题

如图所示在做echarts图表时发现柱状图有数值&#xff0c;但是柱子没展示&#xff0c;后来发现这个没展示的数值是最小值和左侧y轴的最小值保持持平了&#xff0c;所以没有展示出来。 将下图中设置y轴最小值为0就可以了 yAxis: [{type: value,name: 产出,min: 0max: dataMax,ax…

vue组件深入介绍之插槽

了解插槽之前请先了解vue组件基础及注册 Vue2官网介绍 Vue3官网介绍 1、vue2插槽介绍 在2.6.0中&#xff0c;具名插槽和作用域插槽引入了一个新的统一语法&#xff08;v-slot指令&#xff09;。它将取代slot和slot-scope&#xff1b; Vue 实现了一套内容分发的 API&#xf…

从直播消息中找到对应的proto协议内容

这么多直播间的消息&#xff0c;我们该怎么从里面找到我们需要的消息定义呢&#xff1f; 其实只要你能找到这个里面的this对象&#xff0c;就可以看到这个对象上面有一个root > webcast > im 这里面的函数就都是用于解析直播间消息的函数&#xff1a; 想要看一下每个消息…

做工作室项目重要还是运营重要

做工作室项目重要还是运营重要&#xff0c;先说答案&#xff0c;项目好是基础&#xff0c;然后才能谈运营&#xff01; 90%的工作室活不过一年&#xff0c;这句话是有数据支撑的&#xff0c;因为就工商注册的公司而言&#xff0c;一年内倒闭的就是这么个数据&#xff0c;所以工…

grpc学习golang版( 六、服务器流式传输 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、拷贝任意文件进项目四、编写serve…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

网络爬虫(一)

1. 深度优先爬虫&#xff1a;深度优先爬虫是一种以深度为优先的爬虫算法。它从一个起始点开始&#xff0c;先访问一个链接&#xff0c;然后再访问该链接下的链接&#xff0c;一直深入地访问直到无法再继续深入为止。然后回溯到上一个链接&#xff0c;再继续深入访问下一个未被访…

2024年数据和AI趋势报告深度解析:洞悉未来,引领变革

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;和大数据技术正以前所未有的速度重塑着我们的工作和生活方式。Google Cloud发布的《2024年数据和AI趋势报告》为我们提供了一个窗口&#xff0c;让我们得以窥见未来几年内这些技术可能带来的变革。本文将深…

Dev++软件连接Sqlite

Dev中的C语言使用连接sqlite数据库 1.下载sqlite3.dll和sqlite3.h sqlite3.dll类似于.c文件&#xff0c;封装了函数的原型。 sqlite3.h库文件声明函数。 官网地址下载&#xff1a;sqlite sqlite-amalgamation-3460000.zipsqlite-dll-win-x64-3460000.zip 2.新建c项目 1. …

【python】最新版抖音s逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

服务器数据恢复—EVA存储RAID管理信息丢失的数据恢复案例

意外断电导致raid硬件损坏或者riad管理信息丢失等raid模块损坏而导致数据丢失的情况非常普遍。正常情况下&#xff0c;磁盘阵列一旦创建完成就不会再对管理模块中的信息进行更改&#xff0c;但是raid管理模块中的信息属于可修改信息&#xff0c;一次或多次的意外断电可能会导致…

互联网场景下人脸服务解决方案优化设计

1.简介 1.1目的 在过去的一段时间里&#xff0c;因为听见科技业务对人脸服务的需求&#xff0c;所有针对互联网视频中关键人物定位的检索任务&#xff0c;进行了基于互联网场景的人脸基线服务的构建。本文档是针对当前基线解决方案进行优化的方案设计文档。 1.2范围 本文档描述…

2024 全球软件研发技术大会来了!NineData创始人CEO叶正盛将分享《云原生实时数据复制技术原理与实践》主题演讲

2024年7月4-5日&#xff0c;由 CSDN 和 Boolan 联合主办的「2024 全球软件研发技术大会&#xff08;SDCon&#xff09;」将在北京威斯汀酒店举行&#xff0c;将成为引领行业迈向 AI 2.0 时代的重要桥梁。NineData 创始人&CEO叶正盛受邀参会&#xff0c;并将带来《云原生实时…

怎么采集天猫的商品或店铺数据

怎么使用简数采集器批量采集天猫的商品或店铺相关信息呢&#xff1f; 简数采集器暂时不支持采集天猫的商品或店铺相关数据&#xff0c;只能采集页面公开显示的信息&#xff0c;谢谢。 简数采集器抓取网页数据特别简单&#xff0c;不需要懂技术写代码&#xff0c;只需填写网址…

ROS2用c++开发参数节点通信

1.创建节点 cd chapt4/chapt4_ws/ ros2 pkg create example_parameters_rclcpp --build-type ament_cmake --dependencies rclcpp --destination-directory src --node-name parameters_basic --maintainer-name "joe" --maintainer-email "1027038527qq.com&…

大数据开发助手:Coze平台上一款致力于高效解决大数据开发问题的智能Bot!

大数据开发助手&#xff1a;Coze平台上一款致力于高效解决大数据开发问题的智能Bot 核心技术揭秘1. **自然语言处理&#xff08;NLP&#xff09;**2. **知识图谱构建**3. **个性化推荐算法** 功能特色概览1. **即时问题解答**2. **最佳实践分享**3. **个性化学习路径**4. **社区…

在 CentOS 上安装 Docker Engine

前言 Docker 是啥之类的就不必多说了&#xff0c;直接上安装步骤。 官网安装教程地址&#xff1a;https://docs.docker.com/engine/install/centos/ 1.Uninstall old versions &#xff08;卸载旧版本&#xff09; Older versions of Docker went by docker or docker-engin…

error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main_getcmdline 中被引用

VC MFC情况下出现此问题&#xff0c; 网上搜索了很多文章无法解决。 error LNK2019: 无法解析的外部符号 _SDL_main&#xff0c;该符号在函数 _main_utf8 中被引用_sdl2main.lib出现无法解析的外部符号-CSDN博客 字符集必须设置为&#xff1a;

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如&#xff0c;可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器&#xff0c;反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…