优化<template>
<!-- 定义一个带有滚动事件监听的容器 -->
<div class="scroll-container" @scroll="handleScroll">
<!-- 使用 v-for 循环渲染 items 数组中的每一项 -->
<div style="display:flex; flex-direction: column;">
<div v-for="(item, index) in items" :key="index" class="item">
{{ item.name}} <!-- 显示每一项的内容 -->
</div>
</div>
<!-- 当 loading 为真时显示加载提示 -->
<div v-if="loading" class="loading">Loading...</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, onMounted } from 'vue'; // 导入 Vue 3 相关函数和类型
export default defineComponent({
name: 'InfiniteScroll', // 组件名称
setup() {
const items = ref([
{"id": 6, "name": "Item 6", "value": "F"},
{"id": 7, "name": "Item 7", "value": "G"},
{"id": 8, "name": "Item 8", "value": "H"},
{"id": 9, "name": "Item 9", "value": "I"},
{"id": 10, "name": "Item 10", "value": "J"},
{"id": 11, "name": "Item 11", "value": "F"},
{"id": 12, "name": "Item 12", "value": "G"},
{"id": 13, "name": "Item 13", "value": "H"},
{"id": 14, "name": "Item 14", "value": "I"},
{"id": 15, "name": "Item 15", "value": "J"}
]); // 定义响应式数组存储数据项
const loading = ref<boolean>(false); // 定义响应式布尔值表示加载状态
let page = 1; // 定义当前页码,默认为 1
const data1= [
{"id": 6, "name": "Item 6", "value": "F"},
{"id": 7, "name": "Item 7", "value": "G"},
{"id": 8, "name": "Item 8", "value": "H"},
{"id": 9, "name": "Item 9", "value": "I"},
{"id": 10, "name": "Item 10", "value": "J"}
];
const data2= [
{"id": 6, "name": "Item 6", "value": "F"},
{"id": 7, "name": "Item 7", "value": "G"},
{"id": 8, "name": "Item 8", "value": "H"},
{"id": 9, "name": "Item 9", "value": "I"},
{"id": 10, "name": "Item 10", "value": "J"}
];
// 定义异步函数用于获取数据
const fetchData = async () => {
if (loading.value) return; // 如果正在加载则直接返回
loading.value = true; // 设置加载状态为真
try {
// 模拟 API 请求,获取分页数据
// 增加页码
if(page%2==1){
items.value.concat(data1); // 将新数据添加到 items 数组中
}else{
items.value.concat(data2); }// 将新数据添加到 items 数组中}
console.log("items.value",page)
page++;
} catch (error) {
console.error('Error fetching data:', error); // 捕获并打印错误信息
} finally {
loading.value = false; // 无论成功与否,设置加载状态为假
}
};
// 定义滚动处理函数
const handleScroll = (event: Event) => {
const target = event.target as HTMLElement; // 获取事件目标元素
// 判断是否滚动到底部(距离底部小于等于 20px)
if (target.scrollTop + target.clientHeight >= target.scrollHeight - 20) {
console.log("加载")
fetchData(); // 调用 fetchData 函数加载更多数据
}
};
onMounted(() => { // 在组件挂载后执行
fetchData(); // 初始化数据加载
});
return {
items, // 返回 items 响应式数组
loading, // 返回 loading 响应式布尔值
handleScroll, // 返回滚动处理函数
};
},
});
</script>
<style scoped>
/* 定义滚动容器样式 */
.scroll-container {
height: 400px; /* 设置高度 */
overflow-y: auto; /* 启用垂直滚动条 */
border: 1px solid #ccc; /* 添加边框 */
}
/* 定义列表项样式 */
.item {
padding: 10px; /* 设置内边距 */
border-bottom: 1px solid #eee; /* 添加底部边框 */
font-size: 24px;
}
/* 定义加载提示样式 */
.loading {
text-align: center; /* 文本居中 */
padding: 10px; /* 设置内边距 */
}
</style>
最新发布