vue3横向无限滚动滑块

效果如下
在这里插入图片描述

CV大法

<template>
  <h1>横向无限滚动</h1>
  <div id="app" class="scroll-container" @scroll="handleScroll">
    <div v-for="(item, index) in items" :key="index" class="item">
      {{ item }}
    </div>
    <div v-if="isLoading" class="loader">加载中...</div>
  </div>
</template>
<script setup lang="ts">
import { ref, reactive, Ref, onMounted } from 'vue'

const items: any = ref([]) // 存储项目数组
const isLoading = ref(false) // 是否正在加载数据
const page = ref(1) // 当前页数

// 假设这是从服务器获取数据的函数
const fetchData = async (pageNum: any) => {
  // 这里需要你的数据获取逻辑
  // 例如:await api.getData(pageNum);
  // 这里我们只是模拟一些数据
  const newData = Array.from({ length: 10 }, (_, index) => `项目 ${pageNum * 10 + index + 1}`)
  return newData
}

// 处理滚动事件
const handleScroll = (event: any) => {
  const container = event.target
  const { scrollLeft, scrollWidth, clientWidth } = container

  // 接近滚动容器右边界时加载新数据
  if (scrollWidth - scrollLeft - clientWidth <= 100) {
    if (!isLoading.value) {
      isLoading.value = true
      fetchData(page.value).then((newItems: any) => {
        // 更新数据
        items.value = items.value.concat(newItems)
        // 更新页数
        page.value += 1
        // 加载完毕
        isLoading.value = false
      })
    }
  }
}
// 组件挂载后初始化
onMounted(() => {
  // 初始加载数据
  fetchData(1).then(initialItems => {
    items.value = initialItems
  })
})
</script>

<style lang="less" scoped>
.scroll-container {
  display: flex;
  overflow-x: auto;
  white-space: nowrap;
}

.item {
  flex: 0 0 auto;
  width: 200px; /* 假设每个项目宽度为200px */
  height: 100px;
  margin-right: 10px; /* 如果有间距 */
  /* 其他样式 */
}

.loader {
  width: 100px;
  height: 100px;
  /* 加载样式 */
}
.scroll-container::-webkit-scrollbar {
  display: none; /* 在浏览器中隐藏滚动条 */
}
</style>

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值