vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

这篇具有很好参考价值的文章主要介绍了vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

近期在开发可视化大屏项目,除去各种echarts图表和地图展示之外还有多个表格。现在来了一个需求,需要将大屏中的所有表格设置为内容无缝滚动。
本着程序员的七宗罪原则第一时间推脱了一下,但没推脱成功。

  • 简单的在网上查了下适合我们项目的有两种方案,第一种是使用一款插件 vue3-seamless-scroll
  • 第二种方案是自己写JS代码通过计时器去控制表格滚动条自动滚动

方案一

从实际开发上考虑使用如果有类似功能开箱即用没什么问题的插件当然是最好不过的,能提高不少工作效率达到准时下班的目的

vue3-seamless-scroll(点击进入官方文档)

根据插件描述说是目前组件支持上下左右无缝滚动,单步滚动,并且支持复杂图标的无缝滚动,支持平台与Vue3.0支持平台一致。

安装

npm
npm install vue3-seamless-scroll --save

yarn
yarn add vue3-seamless-scroll

browser
<script src="https://unpkg.com/browse/vue3-seamless-scroll@1.0.2/dist/vue3-seamless-scroll.min.js"></script>

配置

  • list

无缝滚动列表数据,组件内部使用列表长度。
type: Array
required: true

  • v-model

通过v-model控制动画滚动与停止,默认开始滚动
type: Boolean
default: true
required: false

  • direction

控制滚动方向,可选值up,down,left,right
type: String
default: “up”
required: false

  • isWatch

开启数据更新监听
type: Boolean,
default: true,
required: false

  • hover

是否开启鼠标悬停
type: Boolean
default: false
required: false

  • count

动画循环次数,默认无限循环
type: Number
default: “infinite”
required: false

  • limitScrollNum

开启滚动的数据量,只有列表长度大于等于该值才会滚动
type: Number,
default: 5,
required: false

  • step

步进速度
type: Number,
required: false

  • singleHeight

单步运动停止的高度
type: Number,
default: 0,
required: false

  • singleWidth

单步运动停止的宽度
type: Number,
default: 0,
required: false

  • singleWaitTime

单步停止等待时间(默认值 1000ms)
type: Number,
default: 1000,
required: false

  • isRemUnit

singleHeight and singleWidth 是否开启 rem 度量
type: Boolean
default: true
required: false

  • delay

动画延时时间
type: Number,
default: 0,
required: false

  • ease

动画效果,可以传入贝塞尔曲线数值
type: String | cubic-bezier,
default: “ease-in”,
required: false

  • copyNum

拷贝列表次数,默认拷贝一次,当父级高度大于列表渲染高度的两倍时可以通过该参数控制拷贝列表次数达到无缝滚动效果
type: Number
default: 1
required: false

  • wheel

在开启鼠标悬停的情况下是否开启滚轮滚动,默认不开启
type: boolean
default: false
required: false

  • singleLine

启用单行横向滚动
type: boolean
default: false
required: false

使用

1. 注册组件
  • 全局注册
// **main.js**
import { createApp } from 'vue';
import App from './App.vue';
import vue3SeamlessScroll from "vue3-seamless-scroll";
const app = createApp(App);
app.use(vue3SeamlessScroll);
app.mount('#app');
  • 单文件注册
<script>
  import { defineComponent } from "vue";
  import { Vue3SeamlessScroll } from "vue3-seamless-scroll";
   export default defineComponent({
      components: {
        Vue3SeamlessScroll
      }
   })
</script>
2. 使用组件

我们这里是需要表格内容滚动,直接使用组件包裹表格会让表格的表头一起跟着滚走了,所以使用上有一点小改动
需要将表格代码再复制一份,第一份代码修改css代码将表格的body部分隐藏,第二份代码用组件包裹,并将其表头部分隐藏;

<template>
    <div class="container">
        <el-table class="top-table" :data="tableData" border style="width: 100%;">
            <el-table-column prop="type" label="类型" width="120" />
            <el-table-column prop="name" label="姓名" />
            <el-table-column prop="content" label="内容" />
        </el-table>
        <vue3-seamless-scroll class="seamless" :list="tableData" :hover="true" :step="0.4" :wheel="true" :isWatch="true">
            <el-table class="bottom-table" :data="tableData" border style="width: 100%;">
                <el-table-column prop="type" label="类型" width="120" />
                <el-table-column prop="name" label="姓名" />
                <el-table-column prop="content" label="内容" />
            </el-table>
        </vue3-seamless-scroll>
    </div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const tableData: any = ref([])

const getData = () => {
    for (let i = 0; i < 6; i++) {
        tableData.value.push({
            type: `家常菜${i + 1}`,
            name: `洋茄子炒鸡蛋${i + 1}`,
            content: `多情键客无情键${i + 1}`
        })
    }
}
getData()
</script>

<style scoped>
.container {
    width: 500px;
    height: 300px;
}
.seamless {
    width: 100%;
    height: 220px;
    overflow: hidden;
}
:deep .top-table .el-table__body-wrapper {
    display: none;
}
:deep .bottom-table .el-table__header-wrapper {
    display: none;
    width: 100%;
}
</style>

vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

这样看效果是不是还行,但是,还有问题,上面示例中我们只造了6条数据,但实际我们项目中表格单页有50条左右数据,那改成50条数据看一下效果

vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

这个插件给它用于表格内容滚动已经做出部分改动了,现在想要达到我们想要的效果还要去做更多的改动,这针对我们现在的需求不能直接开箱即用,到这里我就直接放弃这个方案,如何达到我们想要的效果就放到后面有空的时候再看看,目前还是以工作效率为主。当然如果各位有谁研究好了欢迎私信我,没有奖励只想看看。

方案二

方案二就是直接操作滚动条设置一个计时器让它自己滚动,这个就是比较简单的前端的基本功

思路

我们只需要声明一个计时器,在获取到 table 数据后获取滚动区域 scrollHeight ,在计时器中通过修改 scrollTop 实现滚动条自动滚动
vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

很快码完代码后我们看一下效果

vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码

我的代码

<template>
    <div class="container">
        <el-table ref="tableRef" :data="tableData" border style="width: 100%;height: 100%;">
            <el-table-column prop="type" label="类型" width="120" />
            <el-table-column prop="name" label="姓名" />
            <el-table-column prop="content" label="内容" />
        </el-table>
    </div>
</template>

<script setup>

import { ref, onMounted, onUnmounted } from 'vue'

let timer = null;
let tableRef = ref(null);
const scroll = () => {
    // 在执行新的计时器前将之前的计时器清除
    if (timer) clearInterval(timer);
    let status = true;
    // 获取表格滚动区域的dom
    const scrollDom = tableRef.value.$refs.bodyWrapper.getElementsByClassName("el-scrollbar__wrap")[0];

    // 增加监听事件鼠标移入停止滚动
    scrollDom.addEventListener('mouseover', () => {
        status = false;
    });
    // 鼠标移出恢复滚动
    scrollDom.addEventListener('mouseout', () => {
        status = true;
    });

    // 设置每秒滚动一行
    timer = setInterval(() => {
        if (status) {
        	// 设置每次滚动的像素
            scrollDom.scrollTop += 40;
            // 当滚动到底部时修改scrollTop回到顶部
            if ((scrollDom.scrollHeight - (scrollDom.clientHeight + scrollDom.scrollTop)) < 1 ) {
                scrollDom.scrollTop = 0;
            }
        }
    }, 1000);
}

const tableData = ref([])
const getData = () => {
    for (let i = 0; i < 50; i++) {
        tableData.value.push({
            type: `家常菜${i + 1}`,
            name: `洋茄子炒鸡蛋${i + 1}`,
            content: `多情键客无情键${i + 1}`
        })
    }
    // 要在数据都加载渲染完成后去获取表格的滚动区域dom
    setTimeout(() => {scroll()}, 1000)
}


onMounted(() => {
    getData()
})

onUnmounted(() => {
	// 组件卸载记得清除计时器
    if (timer) clearInterval(timer);
    timer = null;
})

</script>

<style scoped>
.container {
    width: 500px;
    height: 310px;
}
</style>

收尾

最后将成品代码封装起来,在各个地方调用避免冗余代码。好了,今天这个B班就上到这。文章来源地址https://www.toymoban.com/news/detail-490860.html

到了这里,关于vue3 如何实现 表格内容无缝滚动,我又写了一堆冗余代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3如何实现使用SortableJs插件进行表格内的数据项拖拽排序

    npm i sortablejs --save 或者 yarn add sortablejs   我使用的组件库是ant design vue, 我主要使用的是Sortablejs 中的结束拖拽之后的onEnd 属性,因为是单表格的简单拖拽排序所以只用到了自带的参数对象evt的oldIndex和newIndex这两个属性,分别表示被拖拽的数据项拖拽前的下标和拖拽完成之后

    2024年02月11日
    浏览(40)
  • vue 消息左右滚动(前后无缝衔接)

    演示效果 封装的组件 外部引用

    2024年03月23日
    浏览(26)
  • Vue3在点击菜单切换路由时,将ElementPlus UI库中el-main组件的内容滚动恢复到顶部

    功能:Vue3在点击菜单切换路由时,将页面el-main的内容滚动到顶部,布局如下,使用UI组件库为ElementPlus  在网上搜很多都是在route.js中的router.beforeEach中使用window.scrollTop(0,0) 或 window.scrollTo(0,0) 滚动,但是我使用无效,于是使用操作dom的方法,如下 可以使用 watch 函数来  监听

    2024年01月18日
    浏览(37)
  • 【Vue3+element plus 】el-table滚动条、固定列fixed、表头超出内容隐藏并显示省略号

            element plus中el-table采用的是el-scrollbar,无法采用全局默认滚动条样式修改,需要单独写公共样式。 原生滚动条样式 el-table滚动条样式 效果图:         el-table设置了自定义样式后,为el-table-column添加fixed=\\\"right\\\"属性,此时表格侧边栏固定列出现样式错乱,自定义

    2024年02月12日
    浏览(43)
  • vue+element-UI实现跟随滚动条加载表格数据

    el-table当数据量大的时候,实现滚动到底部后加载数据,直接上js代码,有其他需求请各自更改  第一步、在data中定义两个数组 第二步、在数据发生改变的方法中先循环存放一部分数据用于页面显示 第三步、在mounted监听滚动事件

    2024年02月16日
    浏览(44)
  • vue大屏开发系列—列表无缝滚动之vue-seamless-scroll

    目录 一 安装 二 使用  三 简单使用 四  应用 vue-seamless-scroll是一个基于Vue.js的简单无缝滚动组件, 基于requestAnimationFrame实现,配置多满足多样需求。目前支持上下左右无缝滚动,单步滚动,以及支持水平方向的手动切换功能 官方文档:  vue-seamless-scroll的简介及使用教程 - M

    2023年04月15日
    浏览(23)
  • vue | element-ui中 如何修改表格Table组件中滚动条的样式

    在Table表格中,当内容超出容器时就会出现滚动条,elemnt-ui自带的滚动条有时无法满足需求,那么我们可以通过css伪类来实现对滚动条的自定义。 滚动条由两部分组成的: 滑块:可以滑动的部分。 轨道:滚动条的轨道,即滑块的轨道。一般来说滑块的颜色比轨道的颜色深一

    2024年02月11日
    浏览(40)
  • vue-seamless-scroll(一个简单的基于vue.js的无缝滚动)

    一般在数据可视化项目中经常会看到无缝滚动的表格,即轮播表,我们可以使用 vue-seamless-scroll 来实现,使用起来也很方便  vue-seamless-scroll官网:vue-seamless-scroll NPM  Yarn  PNPM  在实际项目中可能不止一个地方使用轮播表,所以我这里还是将其封装为单独一个组件可以复用,

    2024年02月16日
    浏览(28)
  • js实现上下无缝滚动(不卡顿)

    效果图如下: 代码如下:

    2024年02月15日
    浏览(33)
  • css3 实现文字横幅无缝滚动

    使用 css3 关键帧 @keyframes 和 animation 属性实现文字横幅无缝滚动。

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包