【vue scrollTo 数据无限滚动 】

vue数据无限滚动
参考来源 Vue3 实现消息无限滚动的新思路 —— 林三心不学挖掘机
在这里插入图片描述
vue3代码

<template>
  <div class="scroll-container" ref="scrollRef">
    <div v-for="(item, index) in list" :key="index" style="height: 40px; line-height: 40px;">{{ item.title }}</div>
  </div>
</template>

<script setup>
import  { onMounted, ref } from 'vue'
defineOptions({name: 'publicRecruitment-bountyDisplay'})

// 容器的 dom 节点
const scrollRef = ref()
// 模拟列表数据
const dataSource = new Array(10).fill(0).map((_, index) => ({
  title: `这是一条信息${index}`
}))
const list = ref([...dataSource])

// 记录原始数据的长度
const len = dataSource.length
onMounted(() => {
  // 滚动的距离
  let top = 0
  // 索引
  let index = 0

  const scroll = () => {
    // 垂直方向滚动
    scrollRef.value?.scrollTo({
      top: top++
    })
    if (top % 40 === 0) {
      // 哪一项滚不见了,就拿这一项 push 到列表中
      const target = list.value[index]

      if (target) list.value.push(target)
      
      if (index < (len - 1)) {
        // 不断递增
        index++
      } else {
        // 刚好滚动完一轮,重新来过,初始化数据
        top = 0
        index = 0
        scrollRef.value?.scrollTo({
          top: 0
        })
        list.value = [...dataSource]
      }
    }
    // 不断滚动
    requestAnimationFrame(scroll)
  }

  scroll()
})
</script>

<style lang="scss" scoped>
.scroll-container {
  //   防止有滚动条出现
  overflow: hidden;
  height: 150px;
}
</style>

兼容升级版本
1.如果数据长度形成的总高度少于容器高度,不设置滚动
2.如果数据长度仅高于容器高度不足一个数据单位的长度会出现抖动滚动。解决方法:将数据复制一份

删减代码

在这里插入图片描述

<!-- 滚动展示 -->
<template>
  <div style="height: 100%; width: 100%;">
    <div class="mb-3" style="font-size: 13px; color: #666;">无缝衔接滚动</div>
    <!-- 滚动 -->
    <div
      class="scroll-container"
      ref="scrollRef"
      style="height: calc(100% - 32px); overflow: hidden; font-size: 13px;color: #333;"
    >
      <!-- 数据list -->
      <div
        v-for="(item) in list"
        :key="item.name"
        class="d-flex justify-space-between align-center"
        :style="`height: ${dataItemHeight}px;`"
      >
        <div class="ml-2">{{ item.name }}</div>
      </div>
    </div>
  </div>
</template>

<script setup>
import  { onMounted, ref } from 'vue'
defineOptions({name: 'publicRecruitment-bountyDisplay'})
// 滚动实现代码部分
const dataItemHeight = 40
// 容器的 dom 节点
const scrollRef = ref()
// // 模拟列表数据
let listSource = new Array(10).fill(0).map((_, index) => ({ name: `name${index}`}))
const list = ref([...listSource])

// 记录原始数据的长度
let len = listSource.length
onMounted(() => {
  // 滚动的距离
  let top = 0
  // 索引
  let index = 0
  const scroll = () => {
    // 垂直方向滚动
    scrollRef.value?.scrollTo({
      top: top++,
    })
    if (top % dataItemHeight === 0) {
      // 哪一项滚不见了,就拿这一项 push 到列表中
      const target = list.value[index]
      if (target) list.value.push(target)

      if (index < len - 1) {
        // 不断递增
        index++
      } else {
        // 刚好滚动完一轮,重新来过,初始化数据
        top = 0
        index = 0
        scrollRef.value?.scrollTo({
          top: 0,
        })
        list.value = [...listSource]
      }
    }
    // 不断滚动
    requestAnimationFrame(scroll)
  }
  // 如果数据长度形成的总高度少于容器高度,不设置滚动
  const clientHeight = scrollRef.value?.clientHeight
  if (len*dataItemHeight > clientHeight) {
    if ((len - 1)*dataItemHeight < clientHeight) {
      // 如果clientHeight刚好大于len*dataItemHeight,但不满足(len+1)*dataItemHeight会出现抖动。
      // 解决方法:将数据复制一份
      listSource = listSource.concat(...Array.from({ length: 1 }, () => [...listSource]))
      list.value = listSource
      len = listSource.length
    }
    scroll()
  }
})
</script>
<style lang="scss" scoped>
.red {
  color: red;
}
.ellipsisText {
  // width: 120px;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}
</style>

完整代码

在这里插入图片描述

<!-- 滚动展示 -->
<template>
  <div style="height: 100%; width: 100%;">
    <div class="mb-3" style="font-size: 13px; color: #666;">最近30天已有<span class="red">68</span>提现成功,累计提现<span class="red">9450</span></div>
    <!-- 滚动 -->
    <div
      class="scroll-container"
      ref="scrollRef"
      style="height: calc(100% - 32px); overflow: hidden; font-size: 13px;color: #333;"
    >
      <!-- 数据list -->
      <div
        v-for="(item) in list"
        :key="item[keyText] || item.name"
        class="d-flex justify-space-between align-center"
        :style="`height: ${dataItemHeight}px;`"
      >
        <!-- 头像、用户名 -->
        <div class="d-flex align-center">
          <v-avatar size="30" :image="item.avatar || 'https://minio.citupro.com/dev/menduner/7.png'"></v-avatar>
          <div class="ml-2">{{ formatName(item.name) }}</div>
          <!-- <div class="ml-2">{{ item.name }}</div> -->
        </div>
        <div class="d-flex" style="width: calc(100% - 65px);">
          <!-- 内容 -->
          <div class="d-flex ellipsisText mx-4" style="flex: 1;">
            <div>推荐到</div>
            <div class="ellipsisText ml-1" style="max-width: 100px;">{{ item.company }}</div>
            <div class="ellipsisText ml-1" style="max-width: 60px;">{{ item.job }}</div>
          </div>
          <!-- 赏金 -->
          <div>提现¥<span class="red">{{ item.money }}</span></div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import  { onMounted, ref } from 'vue'

defineOptions({name: 'publicRecruitment-bountyDisplay'})
defineProps({
  keyText: {
    type: String,
    default: 'id'
  }
})
const avatarList = [
  'https://img0.baidu.com/it/u=230622178,1565949306&fm=253&fmt=auto&app=138&f=JPEG?w=449&h=300',
  'https://img0.baidu.com/it/u=1401084042,2724457850&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=726',
  'https://img1.baidu.com/it/u=3995643348,1848098846&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=800',
  'https://img0.baidu.com/it/u=230622178,1565949306&fm=253&fmt=auto&app=138&f=JPEG?w=449&h=300',
  'https://img0.baidu.com/it/u=1401084042,2724457850&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=726',
  'https://img1.baidu.com/it/u=3995643348,1848098846&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=800',
  'https://img0.baidu.com/it/u=230622178,1565949306&fm=253&fmt=auto&app=138&f=JPEG?w=449&h=300',
]
let listSource = []
for (let index = 0; index < 68; index++) {
  const obj = {
    id: 'id' + (index+1),
    name: '用户' + (index+1),
    // name: (index+1),
    avatar: avatarList[index % 7],
    company: '某某公司' + (index+1),
    job: '某某职位' + (index+1),
    money: index*index*(100 - index) || 100,
  }
  listSource.push(obj)
}

// 用户名加*号
const formatName = (name) => {
  if (!name.length) {
    return name
  } else if (name.length === 1) {  
    return name // 如果名字只有一个字,则直接返回该字  
  } else if (name.length === 2) {  
    return name.charAt(0) + '*' // 如果名字有两个字,则返回第一个字后跟一个星号  
  } else {  
    return name.charAt(0) + '**' // 如果名字有多于两个字,则返回第一个字后跟两个星号  
  }  
}

// 滚动实现代码部分
const dataItemHeight = 40
// 容器的 dom 节点
const scrollRef = ref()
// // 模拟列表数据
// const listSource = new Array(10).fill(0).map((_, index) => ({ title: `这是一条信息${index}`}))
const list = ref([...listSource])

// 记录原始数据的长度
let len = listSource.length
onMounted(() => {
  // 滚动的距离
  let top = 0
  // 索引
  let index = 0
  const scroll = () => {
    // 垂直方向滚动
    scrollRef.value?.scrollTo({
      top: top++,
    })
    if (top % dataItemHeight === 0) {
      // 哪一项滚不见了,就拿这一项 push 到列表中
      const target = list.value[index]
      if (target) list.value.push(target)

      if (index < len - 1) {
        // 不断递增
        index++
      } else {
        // 刚好滚动完一轮,重新来过,初始化数据
        top = 0
        index = 0
        scrollRef.value?.scrollTo({
          top: 0,
        })
        list.value = [...listSource]
      }
    }
    // 不断滚动
    requestAnimationFrame(scroll)
  }
  // 如果数据长度形成的总高度少于容器高度,不设置滚动
  const clientHeight = scrollRef.value?.clientHeight
  if (len*dataItemHeight > clientHeight) {
    if ((len - 1)*dataItemHeight < clientHeight) {
      // 如果clientHeight刚好大于len*dataItemHeight,但不满足(len+1)*dataItemHeight会出现抖动。
      // 解决方法:将数据复制一份
      listSource = listSource.concat(...Array.from({ length: 1 }, () => [...listSource]))
      list.value = listSource
      len = listSource.length
    }
    scroll()
  }
})
</script>
<style lang="scss" scoped>
.red {
  color: red;
}
.ellipsisText {
  // width: 120px;
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/726376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AD域离线破解新思路:Trustroasting和TimeRoasting

简介 近期Tom Tervoort发表了白皮书《TIMEROASTING, TRUSTROASTING AND COMPUTER SPRAYING》并在Github发布了名为Timeroast的工具包&#xff0c;其中介绍了几种新的攻击思路TimeRoasting、Trustroasting和计算机账户密码喷洒&#xff0c;本篇文章主要对TimeRoasting和Trustro…

Appium:Appium-Python-Client与Selenium版本不兼容导致的问题

一、问题描述 在执行python代码过程中&#xff0c;出现了以下错误&#xff1a; 错误一&#xff1a;No module named appium.webdriver.common.touch_action Traceback (most recent call last):File "d:\xxx\index.py", line 3, in <module> ModuleNotFound…

电动汽车电池是如何制造的

锂离子电池如何工作&#xff1f; 锂离子电池的工作原理是电化学反应&#xff0c;电子在两个电极之间转移&#xff0c;其中一个带负电&#xff0c;另一个带正电。电极浸入导电电解质中&#xff0c;促进带电离子在电极之间移动。 锂离子电池充电 锂离子电池具有插层化合物&…

使用Flink接受kafka中的数据并对数据进行ETL

做这个开发是因为&#xff1a;在实际开发操作中&#xff0c;你的kafka主题中会有大量的数据但是需求并不需要所有数据&#xff0c;所有我们要对数据进行清洗&#xff0c;把需要的数据保存在flink流中&#xff0c;为下流的开发做好数据保障&#xff01; 首先创建工具类 再写一…

ssh生成时注意事项

生成ssh ssh-keygen -t rsa -C "your_emailtemplate.com.cn"重新生成ssh后&#xff0c;拉代码时遇见 remote: remote: remote: remote: The project you were looking for could not be found or you dont have permission to view it. remote: remote: remote: f…

免费分享:1994-2020年中国各行业二氧化碳排放数据(附下载方法)

日前&#xff0c;国务院印发《2024—2025年节能降碳行动方案》针对重点领域进行部署&#xff0c;同时明确了制度标准、价格政策、资金支持、科技引领、市场化机制、全民行动等6项措施&#xff0c;为节能降碳提供支撑保障。1994-2020年中国各行业二氧化碳排放数据为评估环境政策…

RadioML 2016.10a 调制方式识别-IQ分量

文章目录 RadioML 2016.10a 调制方式识别-IQ分量一、IQ分量什么是 IQ 分量&#xff1f;为什么使用 IQ 分量&#xff1f;如何还原原始波形&#xff1f;如何进行傅里叶变换&#xff1f; 二、信号还原1、还原信号2、快速傅里叶变换3、频率域图 三、可视化1、时间域图2、 功率谱图 …

ecoAddRepeater -loc与-offLoadAtLoc的区别

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 ecoAddRepeater -loc {x y} -cell BUF -net NET ecoAddRepeater -offLoadAtLoc {x y} -cell BUF -net NET 都是指定插buf/inv物理位置&#xff0c;区别在于前者用于插buf/inv…

Java多线程+线程池图文实例操作(源码自取)

目录 线程相关概念 并发 并行 继承Thread类 实现Runnable接口 实现Callable接口 使用ExecutorService 和线程池 多线程卖手机 非同步 同步机制卖手机 锁方法 锁代码块 ​编辑锁静态方法 锁静态代码块 线程常用方法 用户线程和守护线程 线程状态 线程池 自定…

Ubuntu/Linux系统安装JDK1.8(带jdk1.8资源和操作教程)

文章目录 前言一、JDK1.8下载二、上传三、安装四、配置环境变量五、查看总结 前言 &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;Ubuntu/Linux jdk1.8安装包&#xff…

手机铃声下载2个必备技巧,定制化铃声,彰显个性魅力

手机铃声&#xff0c;就像是独特的信号灯&#xff0c;不仅仅是通知我们来电或信息的方式&#xff0c;更是展现个人品位和魅力的武器。手机铃声下载和定制&#xff0c;让你的手机从千万舰队中脱颖而出。在接下来的文章中&#xff0c;我们将详细探讨铃声下载技巧的具体操作步骤&a…

第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024)

第二届人工智能、系统与网络安全国际学术会议 (AISNS 2024&#xff09; 2024 2nd International Conference on Artificial Intelligence, Systems and Network Security 一、重要信息 大会官网&#xff1a;www.aisns.org &#xff08;点击参会/投稿/了解会议详情&#xff09…

【Java】已解决java.sql.SQLTimeoutException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.sql.SQLTimeoutException异常 在Java的数据库编程中&#xff0c;java.sql.SQLTimeoutException是一个重要的异常&#xff0c;它通常表示在数据库操作&#xff08;如查询…

Java Array示例说明

Java Array示例说明 数组是相同类型的元素的集合。例如&#xff0c;int数组包含整数元素&#xff0c;String数组包含String元素。Array的元素存储在内存中的相邻位置。Java中的数组基于零基索引系统&#xff0c;这意味着第一个元素位于索引0处。 数组如下所示&#xff1a; i…

C++回溯算法(2)

棋盘问题 #include<bits/stdc.h> using namespace std; void func(int,int); bool tf(int,int); void c(); int n,k; char a[110][110]; int cnt20; int main() {cin>>n>>k;for(int i0;i<n;i){for(int j0;j<n;j){cin>>a[i][j];}}func(0,0);cout…

企业PC端官网在线客服源码系统 完全开源可二开 附带源代码包+搭建部署教程

系统概述 企业 PC 端官网在线客服源码系统是一款专为企业打造的先进客服解决方案。它基于先进的技术架构&#xff0c;旨在为企业提供稳定、高效、功能丰富的在线客服服务。 该系统采用了模块化设计理念&#xff0c;将各个功能模块有机地整合在一起&#xff0c;形成了一个完整…

GPT大模型不再遥不可及:本地化部署让每个人都能拥有

01、本地化部署是GPT发展的一个趋势 我们提到大模型就想到这个东西不是我们普通人可以拥有的&#xff0c;因为太耗费服务器资源&#xff0c;注定了可以提供大模型服务的只能是大厂。 然而有需求就会有解决方案&#xff0c;那就是让大语言模型对特定地区的行业和专业领域有较强…

时间复杂度的相关概念

1. 统计时间增长趋势 时间复杂度分析统计的不是算法运行时间&#xff0c;而是算法运行时间随着数据量变大时的增长趋势&#xff0c;也就是算法运行时间与输入数据的关系。 // 算法 A 的时间复杂度&#xff1a;常数阶 function algorithm_A(n) {console.log(0); } // 算法 B 的…

二叉树(数据结构篇)

数据结构之二叉树 二叉树 概念&#xff1a; 二叉树(binary tree)是一颗每个节点都不能多于两个子节点的树&#xff0c;左边的子树称为左子树&#xff0c;右边的子树称为右子树 性质&#xff1a; 二叉树实际上是图&#xff0c;二叉树相对于树更常用。 平衡二叉树的深度要比…

(3) cmake编译多个cpp文件

文章目录 概要整体代码运行结果 概要 上一节中实现了对单个cpp文件用cmake编译。这一节升级一下 整体代码 main.cpp #include <iostream> #include "person.h"using namespace std;int main() {person me person("langdaoliu", 28, "engin…