当前位置: 首页 > 知识库问答 >
问题:

插件 - Ant Design Table 表格的无缝滚动怎么实现啊?

阙沛
2024-01-11

基于AntdTable表格无缝滚动怎么实现啊?或者有什么插件吗?

...........

共有2个答案

章锦
2024-01-11

我自己写了一个无缝滚动组件,你可以拿去试一试

<!-- 使用方法:注意点:1.如果是弹窗中使用,最好每次打开时重新初始化一下// 初始化setTimeout(() => {  stRef.value.init();}, 50);2.如果需要重置滚动高度stRef.value.scrollTop(0);3.如果有分页,paging中的三个数据,是用来判断是否已加载完成的,如果不需要分页:paging="false"<tScrollTable ref="stRef" :table="_d.table" :paging="_d.paging" @next="getNext()">  <template #bodyCell="{record, column}">    <div v-if="column.dataIndex == 'actions'" class="flex justify-center items-center h-full w-full">      <span>详情</span>    </div>    <template v-else>{{record[column.dataIndex]}}</template>  </template></tScrollTable><script>const _d = reactive({    table: {        head: [            {title: '制造单位', dataIndex: 'organization_name'},      {title: '设备类别', dataIndex: 'name'},      {title: '操作', dataIndex: 'actions'},        ],        data: []    },    paging: {        current: 1,    pageSize: 15,    total: 0    }})function search() {  _d.paging.current = 1;  _d.table.data = [];  getData();}function getNext() {  _d.paging.current++;  getData();}// 获取列表function getData() {    d.loading = true;  let params = {    pageCurrent: _d.paging.current,    pageRows: _d.paging.pageSize,    areaCode: _d.areaCode  }  http.postAction(CLOUD_STAT+"onlineData/getCodeEquipmentList", params).then(res => {    _d.paging.total = res.rowSum; // 注意:必须要设置total    let list = res.rowDatas;    if(_d.paging.current == 1) {      _d.table.data = [...list];    }  else {      _d.table.data.push(...list);    }  }).finally(() => {    _d.loading = false;  })}</script> --><template>  <div class="t-scroll-table" :style="{height: props.height}">        <div class="t-header"            :style="{paddingRight: _d.headPr}">            <div class="tr" :style="props.headerTrStyle">                <div v-for="(item, index) in props.table.head" :key="index"                     class="td"                    :style="{width: item.width, flex: item.width ? 'initial' : '1', ...props.tdStyle}">{{item.title}}</div>            </div>        </div>        <div class="t-body">            <div ref="scrollWrapperRef" class="scroll-wrapper">              <div ref="scrollContentRef" class="scroll-content">                  <div v-for="(aItem, aIndex) in props.table.data" :key="aIndex" class="tr" :style="props.bodyTrStyle">                      <div v-for="(bItem, bIndex) in props.table.head" :key="bIndex"                           class="td"                          :style="{width: bItem.width, flex: bItem.width ? 'initial' : '1', ...props.tdStyle}"                          :title="aItem[bItem.dataIndex]">                          <template v-if="slots.bodyCell">                              <slot name="bodyCell" :column="bItem" :record="aItem" :index="aIndex" :text="aItem[bItem.dataIndex]"></slot>                          </template>                          <template v-else>                              {{aItem[bItem.dataIndex]}}                          </template>                      </div>                  </div>                  <div v-if="props.paging" class="table-tip">                    <template v-if="notEnd">                        <LoadingOutlined style="margin-right: 5px;" />                        正在加载中                    </template>                    <template v-else>{{props.table.data.length ? '没有更多了' : '暂无数据'}}</template>                </div>                <div v-else-if="!props.table.data.length" class="table-tip">暂无数据</div>              </div>          </div>        </div>    </div></template><script setup>import { reactive, ref, onMounted, useSlots, computed, watch } from 'vue'import { LoadingOutlined } from '@ant-design/icons-vue';const scrollWrapperRef = ref();const scrollContentRef = ref();const slots = useSlots();const emits = defineEmits(['next']);const props = defineProps({    // 包裹成高度    height: {        type: String,        default: '685px'    },    table: {        type: Object,        default: () => ({            head: [],            data: []        })    },    // 如果返回false,表示不分页    paging: {        type: [Object, Boolean],        default: () => ({            current: 1,          pageSize: 15,          total: 0        })    },    // 表头样式    headerTrStyle: {        type: Object,        default: () => ({})    },    // 表身样式    bodyTrStyle:{        type: Object,        default: () => ({})    },    // td样式    tdStyle: {        type: Object,        default: () => ({})    }})const _d = reactive({    headPr: 0})const notEnd = computed(() => {    return props.paging ? props.paging.current*props.paging.pageSize<props.paging.total : false;})// 获取表格头部是否设置pdding-rightwatch(() => props.table.data.length, () => {    setTimeout(() => {        if(scrollContentRef.value && scrollWrapperRef.value) {            if(scrollContentRef.value && scrollWrapperRef.value) {                _d.headPr = scrollContentRef.value.clientHeight > scrollWrapperRef.value.clientHeight ? '3px' : 0            } else {                _d.headPr = 0;            }        }    }, 100)}, {    immediate: true})onMounted(() => {    oScroll.init()})// 滚动对象const oScroll = {    oWrapper: null,    oContent: null,    wrapperHeight: 0,    init() {        console.log('初始化');        oScroll.oWrapper = scrollWrapperRef.value;        if(!oScroll.oWrapper) {            return;        }        oScroll.oContent = scrollContentRef.value;        oScroll.wrapperHeight = oScroll.oWrapper.clientHeight;        // 设置滚动事件        let scrollTime = 0;        oScroll.oWrapper.onscroll = (params) => {            if(notEnd.value && oScroll.isScrollBottom(params.target.scrollTop)) {                let currentTime = new Date().getTime();                if(currentTime - scrollTime > 500) { // 0.5秒内只能触发一次                    scrollTime = currentTime;                    console.log('触发');                    emits('next');                }            }        }    },    // 判断滚动是否触底    isScrollBottom(scrollTop) {        let contentHeight = oScroll.oContent.clientHeight;        if(contentHeight - oScroll.wrapperHeight < scrollTop + 20) {            return true;        } else {            return false;        }    }}//设置滚动高度function scrollTop(top){    if(oScroll.oWrapper){        oScroll.oWrapper.scrollTop = top    }}defineExpose({    init: oScroll.init,    scrollTop})</script><style lang="less" scoped>.t-scroll-table {    color: #fff;    display: flex;    flex-direction: column;    font-size: 14px;    .t-header {        .tr {            background: #05314A;        }    }    .t-body {        flex: 1;        height: 0;        .tr {            margin-top: 10px;            background: #07263B;        }    }    .tr {        display: flex;        .td {            flex: 1;            line-height: 42px;            padding: 0 16px;            height: 42px;            text-align: center;            white-space: nowrap;            overflow: hidden;            text-overflow: ellipsis;        }    }}.scroll-wrapper {    height: 100%;    overflow: auto;    &::-webkit-scrollbar {      width: 3px;    }}.table-tip {    margin-top: 5px;    height: 30px;    display: flex;    align-items: center;    justify-content: center;    color: #aaa;}</style>

下面是我在一个弹窗中使用的示例

<template>  <div>    <a-modal v-model:visible="_d.visible" title="赋码管理" width="1250px">      <a-spin :spinning="_d.loading">        <tScrollTable ref="stRef" :table="_d.table" :paging="_d.paging" @next="getNext()">          <template #bodyCell="{record, column}">            <div v-if="column.dataIndex == 'ewm'" class="flex justify-center items-center h-full w-full">              <img class="ewm" src="@/assets/online/ewm-02.png"/>            </div>            <div v-else-if="column.dataIndex == 'organization_name'" :title="record[column.dataIndex]">              {{oSimple.unitName(record[column.dataIndex])}}            </div>            <template v-else>{{record[column.dataIndex]}}</template>          </template>        </tScrollTable>      </a-spin>    </a-modal>  </div>    </template><script setup>import { reactive, ref, onMounted } from 'vue'import tScrollTable from "./modules/tScrollTable/index.vue";import * as echarts from "echarts";import dayjs from "dayjs";import { CLOUD_STAT } from "@/api";import { http } from "qlrz-service";import {oSimple} from "@/utils/Tools.js";const stRef = ref();const _d = reactive({  visible: false,  areaCode: '',  table: {    head: [      {title: '制造单位', dataIndex: 'organization_name'},      {title: '设备类别', dataIndex: 'name'},      {title: '设备代码', dataIndex: 'equipment_code'},      {title: '设备名称', dataIndex: 'device_name'},      {title: '安全码', dataIndex: 'ewm'},    ],    data: []  },  paging: {    current: 1,    pageSize: 15,    total: 0  }})onMounted(() => {  })function open(areaCode) {  _d.areaCode = areaCode || '';  _d.visible = true;  // 初始化  setTimeout(() => {    stRef.value.init();  }, 50);  search();}function search() {  _d.paging.current = 1;  _d.table.data = [];  getData();}function getNext() {  _d.paging.current++;  getData();}// 获取列表function getData() {  _d.loading = true;  let params = {    pageCurrent: _d.paging.current,    pageRows: _d.paging.pageSize,    areaCode: _d.areaCode  }  http.postAction(CLOUD_STAT+"onlineData/getCodeEquipmentList", params).then(res => {    _d.paging.total = res.rowSum;    let list = res.rowDatas;    if(_d.paging.current == 1) {      _d.table.data = [...list];    }  else {      _d.table.data.push(...list);    }  }).finally(() => {    _d.loading = false;  })}defineExpose({  open})</script><style lang="less" scoped>.ewm {  width: 28px;  height: 28px;}</style>
桑博远
2024-01-11

对于Ant Design的Table组件,无缝滚动功能目前并没有直接提供。但是,你可以通过自定义滚动条样式,结合css来模拟无缝滚动效果。具体做法是将你的表格固定在一个高度,并让滚动条滚动到底部后立即回到顶部,这样看起来就像一个无缝的滚动效果。

不过要注意的是,这并不是真正的无缝滚动,因为实际上滚动条还是会在滚动到底部后停止,只是视觉效果上看起来像是无缝的。

如果你需要更复杂的功能,例如真正的无缝滚动或者分页加载数据等,可能需要使用第三方的插件或者自己开发相应的功能。

对于插件,你可以在GitHub等开源代码库中搜索相关的插件,看看是否有符合你需求的。你也可以尝试自己开发,使用React的hooks和生命周期函数来控制滚动条的滚动位置和加载数据等。

 类似资料:
  • 本文向大家介绍jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果,包括了jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了jquery.kxbdmarquee.js无缝滚动的具体代码,供大家参考,具体内容如下 strep1.页面引入相关文件 step2.写html结构、css样式、js c

  • 本文向大家介绍JQuery插件Marquee.js实现无缝滚动效果,包括了JQuery插件Marquee.js实现无缝滚动效果的使用技巧和注意事项,需要的朋友参考一下 Marquee.js插件提供了许多属性选项,您可以配置定制外观和效果。 详细代码: 以上就是本文的全部内容,希望对大家学习jquery程序设计有所帮助。

  • 本文向大家介绍js实现无缝滚动图,包括了js实现无缝滚动图的使用技巧和注意事项,需要的朋友参考一下 效果如下: 代码如下: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 本文向大家介绍javascript实现文字无缝滚动,包括了javascript实现文字无缝滚动的使用技巧和注意事项,需要的朋友参考一下 效果如图: html:( 一个div 包裹两个ul ) js代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍js实现无缝滚动特效,包括了js实现无缝滚动特效的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家介绍了js实现无缝滚动特效需要做到的功能,以及关键性js代码,分享给大家供大家参考,具体内容如下 运行效果图: 结合下学了的知识,做个模拟的综合性扩展练习~~  大致功能如下: 1、点开html后,图片自动移动展示 2、点击左右方向,可以改变 图片移动的方向(改变left的值,正负

  • 本文向大家介绍Javascript 实现图片无缝滚动,包括了Javascript 实现图片无缝滚动的使用技巧和注意事项,需要的朋友参考一下 效果 : 鼠标移入图片 停止滚动, 鼠标移出自动滚动 可以调整向左或右方向滚动 以上是一个简单的布局,下面是主要的Javascript 代码 简单讲下思路: 首先设置ul 里面的图片一共有8张 oUl.innerHTML += oUl.innerHTML; 在