-
原生方法
- 添加一个用于显示数据的列表容器
<div id="app"> <ul id="data-list"> <!-- 在这里展示数据 --> </ul> </div>
- 在Vue的实例中,定义数据和方法:
new Vue({ el: '#app', data: { dataList: [], // 存储加载的数据 currentPage: 1, // 当前页数 isLoading: false // 标记是否正在加载数据 }, mounted() { // 初始化时加载第一页数据 this.loadMoreData(); // 监听滚动事件 window.addEventListener('scroll', this.handleScroll); }, methods: { loadMoreData() { if (!this.isLoading) { this.isLoading = true; // 发起请求获取新数据 // 例如使用axios发送Ajax请求 axios.get('/api/data?page=' + this.currentPage) .then(response => { this.dataList = this.dataList.concat(response.data); // 追加新数据到列表 this.currentPage++; // 增加页数 this.isLoading = false; // 加载完毕,将isLoading设置为false }) .catch(error => { console.error(error); this.isLoading = false; // 请求出错时,也要将isLoading设置为false }); } }, handleScroll() { // 检查是否滚动到页面底部 const scrollHeight = document.documentElement.scrollHeight; const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; const clientHeight = document.documentElement.clientHeight; if (scrollTop + clientHeight >= scrollHeight - 10) { // 触发加载更多数据 this.loadMoreData(); } } } });
- 在上述代码中,通过
loadMoreData()
方法来加载更多数据。确保在调用该方法时,isLoading
标志位为false
,以避免多次并发请求。请求成功后,将新数据追加到dataList
数组中,并增加当前页数currentPage
,然后将isLoading
标志位设置为false
。如果请求失败,也需要将isLoading
标志位设置为false
,以避免无法继续加载数据。handleScroll()
方法用于监听滚动事件,并在滚动到页面底部时触发加载更多数据的操作。通过比较页面的高度、滚动的高度以及可见区域的高度,判断滚动位置是否接近页面底部。当条件满足时,调用loadMoreData()
方法加载更多数据。
-
使用插件vue-infinite-loading(使用文档说明链接:vue-infinite-loading)
- 安装插件,在项目目录下打开终端,执行以下命令安装
vue-infinite-loading
插件:npm install vue-infinite-loading
- 引入插件
在Vue的入口文件(通常是main.js
)中,通过import
语句引入vue-infinite-loading
插件:import Vue from 'vue'; import InfiniteLoading from 'vue-infinite-loading'; // 注册vue-infinite-loading组件 Vue.use(InfiniteLoading);
- 在组件中使用插件
在需要使用无限滚动加载的组件中,使用infinite-loading
组件和相应的事件来实现无限滚动加载功能。以下是一个示例:<template> <div> <ul> <!-- 渲染列表数据 --> <li v-for="item in itemList" :key="item.id">{{ item.name }}</li> </ul> <!-- infinite-loading组件 --> <infinite-loading @infinite="loadMoreItems"> <div slot="no-more">已加载全部数据</div> </infinite-loading> </div> </template> <script> export default { data() { return { itemList: [], // 存储加载的列表数据 currentPage: 1 // 当前页码 }; }, methods: { loadMoreItems($state) { // 加载更多数据 // 例如使用axios发送Ajax请求 axios.get('/api/data?page=' + this.currentPage) .then(response => { const newDataList = response.data; // 判断是否还有更多数据 if (newDataList.length > 0) { // 追加新数据到itemList中 this.itemList = this.itemList.concat(newDataList); this.currentPage++; // 告诉插件加载成功 $state.loaded(); } else { // 所有数据加载完毕 $state.complete(); } }) .catch(error => { console.error(error); // 告诉插件加载失败 $state.error(); }); } } }; </script>
-
使用
infinite-loading
组件来实现无限滚动加载的功能。通过监听infinite
事件,当滚动到加载更多的位置时,执行loadMoreItems
方法来加载更多数据。在loadMoreItems
方法中,通过Ajax请求获取数据,并根据返回结果追加数据到itemList
数组中。根据数据是否已经加载完成,使用不同的插件状态方法(loaded()
、complete()
、error()
)告知插件加载状态。
-
vue3 无限下拉滚动插件vue3-infinite-scroll-better 、作者github地址
- 使用
import infiniteScroll from 'vue3-infinite-scroll-better' app.use(infiniteScroll).mount('#app')
- 例子
<div class="list-lis" v-infinite-scroll="handleInfiniteOnLoad" :infinite-scroll-immediate-check="false" :infinite-scroll-disabled="scrollDisabled" :infinite-scroll-watch-disabled="scrollDisabled" :infinite-scroll-distance="20"> <a-list size="small" bordered item-layout="horizontal" :data-source="List" > <template #renderItem="{ item, index }"> <a-list-item> <a-skeleton :title="false" :loading="item.loading" active> <a-list-item-meta :description="item.email"> <template #title> <span>{{ item.nickname }}</span> </template> </a-list-item-meta> <div> //数据 </div> </a-skeleton> </a-list-item> </template> </a-list> </div>
setup(props, context) { const List= [] // 数据列表 const listCount = 50 const handleInfiniteOnLoad = () => { // 异步加载数据等逻辑 if (scrollDisabled) { // 数据加载完毕 } else { // 加载数据列表 } } const scrollDisabled = computed(() => renderDataList.length >= listCount) return { scrollDisabled, renderDataList, handleInfiniteOnLoad } }
- 支持Vue3的滚动加载插件,所有用法和vue-infinite-scroll一致。详细api功能可点击作者链接查看