在如今的 Web 应用开发中,为了给用户提供更加流畅、高效的体验,许多应用都会采用列表无限加载的技术,比如常见的社交媒体动态列表、电商商品列表等。
下面,我将结合实际项目,详细介绍列表无限加载功能的实现过程。
一、实现原理
列表无限加载功能的核心原理是利用elementPlus
提供的v-infinite-scroll
指令,通过监听页面滚动事件,判断是否满足触底条件。
当满足触底条件时,增加页数参数,获取下一页的数据,并将新数据与老数据进行拼接,重新渲染列表,从而实现列表的无限加载效果。
在加载完成所有数据后,停止监听滚动事件,避免无效请求。
二、具体实现步骤
(一)准备接口
在实现无限加载之前,需要准备好获取数据的接口。以项目中的getSubCategoryAPI
接口为例,它接收包含categoryId
(分类 ID)、page
(当前页数)、pageSize
(每页数据量)和sortField
(排序字段)等参数的对象,通过POST
请求从服务器获取相应的数据。
/**
* @description: 获取导航数据
* @data {
categoryId: 1005000 ,
page: 1,
pageSize: 20,
sortField: 'publishTime' | 'orderNum' | 'evaluateNum'
}
* @return {*}
*/
export const getSubCategoryAPI = (data) => {
return request({
url:'/category/goods/temporary',
method:'POST',
data
})
(二)初始化数据
在 Vue 组件中,定义用于存储商品列表数据的响应式变量goodList
,并初始化请求数据对象reqData
,设置初始的categoryId
、page
、pageSize
和sortField
。同时,定义一个用于判断是否加载完毕的响应式变量disabled
,初始值设为false
。
<script setup>
// 获取基础列表数据渲染
const goodList = ref([])
const reqData = ref({
categoryId: route.params.id,
page: 1,
pageSize: 20,
sortField: 'publishTime'
})
// 判断是否加载完毕
const disabled = ref(false)
</script>
(三)加载更多数据的逻辑实现
定义加载更多数据的函数load
,在函数内部,首先将reqData
中的page
值加 1,以获取下一页的数据。然后调用getSubCategoryAPI
接口,并将新获取的数据与原有的goodList
数据进行拼接。
最后,根据新获取数据的长度判断是否已经加载完所有数据,如果新数据长度为 0,则表示已全部加载完毕,将disabled
设为true
,停止后续的加载操作。
// 加载更多
const load = async () => {
console.log('加载更多数据咯')
// 获取下一页的数据
reqData.value.page++
const res = await getSubCategoryAPI(reqData.value)
goodList.value = [...goodList.value, ...res.result.items]
// 加载完毕 停止监听
if (res.result.items.length === 0) {
disabled.value = true
}
(四)配置v-infinite-scroll
指令
在模板中,使用v-infinite-scroll
指令绑定load
函数,并设置infinite-scroll-disabled
属性为disabled
。这样,当页面滚动到触底位置时,会自动调用load
函数加载更多数据,并且在数据全部加载完毕后,停止触发加载操作。
<template>
<div v-infinite-scroll="load" infinite-scroll-disabled="disabled">
<!-- 商品列表展示部分 -->
<div v-for="(item, index) in goodList" :key="index">
<!-- 展示商品的具体信息,如图片、名称、价格等 -->
<img :src="item.image" alt="商品图片">
<p>{{ item.name }}</p>
<p>{{ item.price }}</p>
</div>
</div>
</template>
三、可能遇到的问题及解决方法
(一)数据重复加载
在某些情况下,可能会出现数据重复加载的问题。这可能是由于在获取新数据时,没有正确判断数据是否已经存在于现有列表中。
解决方法是在拼接新数据之前,先对新数据进行去重处理。可以使用Set
数据结构或自定义的去重函数来实现。
(二)加载性能问题
当数据量较大时,频繁的接口请求和数据拼接可能会导致性能下降。
可以采用分页加载和缓存机制相结合的方式来优化性能。在用户滚动过程中,提前预加载下一页的数据,并且将已经加载过的数据进行缓存,避免重复请求相同的数据。
(三)触底判断不准确
在一些复杂的页面布局中,触底判断可能会出现不准确的情况。这可能是由于页面元素的高度计算错误或者滚动事件的监听异常导致的。
可以通过检查页面元素的高度计算是否正确,并且使用浏览器提供的调试工具来监测滚动事件的触发情况,确保触底判断的准确性。
四、实现效果
无限加载演示视频
列表无限加载功能在提升用户体验方面起着重要作用,通过合理运用上述实现方法和优化策略,可以有效地实现这一功能,并解决在开发过程中可能遇到的问题。