news 2026/4/16 14:30:03

vue3手机端列表加载组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vue3手机端列表加载组件

手机端列表加载组件

功能描述

  • 适用手机端,实现列表加载功能。

实现方案

基础用法

<template><PageList:getList="getList"style="height:100%;"><template#default="{ item }"><!-- 渲染列表项 --><divclass="list-item">{{ item.name }}</div></template><template#empty><div>没有数据可显示</div></template></PageList></template><scriptsetup>import{ref}from"vue";importPageListfrom"@/components/PageList/index.vue";// 根据实际路径引入组件constquery=ref({memberId:123,});constgetList=async({pageNum,pageSize})=>{// 在这里实现你的数据请求逻辑query(其他参数 如 memberId等)constres=awaitqueryList({pageNum,pageSize,...query.value});returnres;};</script>

2. 自定义加载文字和属性

你可以通过options属性来自定义加载文字和其他参数。options是一个对象,支持以下属性:

  • pageNum: 当前页码,默认值为1
  • pageSize: 每页显示的数据条数,默认值为10
  • finishedText: 当数据加载完毕时显示的文本,默认值为到底了
  • loadingText: 加载中的文本,默认值为加载中...
2.1 示例
constoptions={pageNum:1,pageSize:20,// 自定义每页显示20条数据finishedText:"没有更多数据了",// 自定义加载完毕提示loadingText:"请稍等,加载中...",// 自定义加载提示};

4. 搜索功能

如果需要在列表中实现搜索功能,你可以在请求数据时传递搜索参数,并在getList方法中处理。

4.1 实现步骤
  1. 添加搜索输入框: 在你的组件中添加一个搜索框,通过输入获取搜索关键词。
  2. 更新请求参数: 将输入的搜索关键词添加到请求参数中。
4.2 示例
<template><input v-model="searchQuery"placeholder="搜索..."@input="handleSearch"/><PageList:options="options":getList="fetchData"><template #default="{ item }"><divclass="list-item">{{item.name}}</div></template></PageList></template><script setup>import{ref}from'vue';importPageListfrom'./PageList.vue';constsearchQuery=ref('');consthandleSearch=()=>{// 重置搜索 刷新列表数据proxy.$refs["pagelistRef"].refresh();};constfetchData=async({pageNum,pageSize})=>{// 在这里实现你的数据请求逻辑query(其他参数 如 memberId等)constres=awaitqueryList({pageNum,pageSize,...searchQuery.value})returnres;};</script>

设计思路

  1. 借鉴 Element Plus 的自定义指令: 在组件设计中,主要沿用了 Element Plus 提供的v-infinite-scroll自定义指令,这样可以充分利用现有的成熟解决方案,实现无限滚动加载功能,确保在处理大量数据时能够高效且流畅地加载列表内容。
  2. 灵活的公共参数设置: 设计中为主要公共参数设置了默认值,使得组件在使用时更加灵活和易于配置。用户可以根据具体需求自定义pageNumpageSizefinishedTextloadingText等属性,以适应不同场景下的使用,提升了组件的通用性和适应性。
  3. 使用 Vue 3 插槽实现列表内容渲染: 列表内容的渲染采用了 Vue 3 的插槽机制,使得使用者可以方便地自定义每个列表项的显示方式。这种设计不仅提高了组件的可扩展性,还允许开发者根据具体需求自定义列表项的样式和内容,从而提供更好的使用体验。

组件代码

<template><divstyle="overflow-y:auto"v-infinite-scroll="getListData":infinite-scroll-distance="50"><slotv-for="(item, index) in listData":key="index":item="item"></slot><divclass="list-tip"><divv-if="count === 0"><divv-if="$slots.empty"><slotname="empty"></slot></div><el-emptyv-elsedescription="暂无数据"/></div><divclass="by-divider"v-if="count > 0 && listData.length >= count">{{ props.options.finishedText }}</div><divclass="list-loading"v-if="loading"v-loading="loading":element-loading-text="props.options.loadingText"></div></div></div></template><scriptsetupname="PageList">import{ref,toRefs}from"vue";constprops=defineProps({//配置参数options:{type:Object,default:()=>({pageNum:1,pageSize:10,finishedText:"到底了",loadingText:"加载中...",}),},//请求列表数据接口getList:{type:Function,default:()=>()=>{},},});constlistData=ref([]);//列表数据constloading=ref(false);//加载状态constcount=ref(-1);constqueryParams=ref({pageNum:props.options.pageNum,pageSize:props.options.pageSize,});//请求参数constgetListData=async()=>{// 处于加载状态和已经加载完毕,则不再请求数据if(loading.value||(listData.value.length>=count.value&&count.value!=-1))return;loading.value=true;try{const{pageNum,pageSize}=queryParams.value;constres=awaitprops.getList({pageNum,pageSize});if(res.code=="0"){listData.value=listData.value.concat(res.data);count.value=res.count;queryParams.value.pageNum++;}loading.value=false;}catch(error){loading.value=false;}};constrefresh=()=>{count.value=-1;queryParams.value.pageNum=1;listData.value=[];getListData();};// 定义 loadMore 方法constloadMore=()=>{console.log("Pulled to the top, loading more items...");// 在这里添加加载数据的逻辑,例如发起 API 请求// 示例:items.value.push(...newItems);};// 定义内部指令constpullDown={mounted(el,binding){constcallback=binding.value;// 获取传入的回调函数if(typeofcallback!=="function"){thrownewError("v-pull-down binding value must be a function");}constonScroll=()=>{const{scrollTop}=el;console.log(scrollTop);// 判断是否滚动到顶部if(scrollTop===0){callback();// 调用回调函数}};el.addEventListener("scroll",onScroll);// 清理工作el._onScroll=onScroll;// 保存引用以便在 unmounted 中使用},unmounted(el){el.removeEventListener("scroll",el._onScroll);// 移除事件监听},};defineExpose({pullDown,listData,loading,refresh,});</script><stylelang="scss"scoped>.list-loading{--el-loading-spinner-size:30px;--el-color-primary:#969799;height:var(--el-loading-spinner-size);margin:15px 0px;background:transparent; :deep(.el-loading-spinner){display:flex;justify-content:center;align-items:center;}:deep(.el-loading-text){margin-left:10px;}:deep(.el-loading-mask){background:transparent;}}.by-divider{margin:16px 0px;color:#969799;font-size:14px;line-height:24px;border-color:#ebedf0;border-style:solid;border-width:0;align-items:center;display:flex; &:before, &:after{content:"";box-sizing:border-box;border-color:inherit;border-style:inherit;border-width:1px 0 0;flex:1;height:1px;display:block;}&:before{margin-right:16px;}&:after{margin-left:16px;}}</style>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 15:18:20

全网首先发现 android NSDManager做mDNS发现可能无反应

转载必须标明出处 https://blog.csdn.net/jzlhll123 概述 Android 在利用 NsdManager 进行局域网服务发现&#xff08;如 mDNS&#xff09;时&#xff0c;可能遇到的因设备兼容性问题导致的失败。核心结论是&#xff1a;为确保应用在绝大多数 Android 设备上稳定运行&#xff0…

作者头像 李华
网站建设 2026/4/16 12:59:38

​九科信息Agent智能体数据治理解决方案,让数据治理从“人治”到“自治”

目前,数据已成为企业数智化转型的核心资产,但传统数据治理模式长期依赖人工操作,效率低下、质量不稳等问题突出。九科信息推出的Agent智能体数据治理解决方案,以大模型自动化引擎重构治理逻辑,推动数据治理从“人治”向“自治”跨越,为企业释放数据价值提供坚实支撑。大模型自动…

作者头像 李华
网站建设 2026/4/16 13:33:51

本科高职海量题库资源:助力高校教考分离

在教育教学数字化发展的趋势下&#xff0c;针对本科和高职高专教育的题库资源建设已成为支持院校开展高效教学与科学测评的重要基础。这类题库通常要求资源丰富、分类清晰、持续更新&#xff0c;能够帮助学校降低自主建库成本&#xff0c;快速投入日常练习、正式考试和学情分析…

作者头像 李华
网站建设 2026/4/16 14:02:57

Flutter Admin后台管理系统:5大核心模块构建企业级管理平台

Flutter Admin后台管理系统&#xff1a;5大核心模块构建企业级管理平台 【免费下载链接】flutter_admin Flutter Admin: 一个基于 Flutter 的后台管理系统、开发模板。A backend management system and development template based on Flutter 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/4/16 12:20:56

思屋电气承接千万级配电项目,以安全用电守护民生教育工程

近日&#xff0c;思屋电气依托在电力建设领域的深厚积淀与丰富实践经验&#xff0c;成功中标并正式承接“北投印象项目Ⅰ标段、配套小学、幼儿园供配电工程”施工项目&#xff0c;合同金额超千万元。目前&#xff0c;该项目已全面展开施工建设。此次成功中标与承建&#xff0c;…

作者头像 李华