基于Element-Plus的表格自动滚动hooks

场景:近期在做页面的时候,公司有这么一个需求:要做一个看板,然后这个看板里面有很多列表,列表自动滚动,表格内的内容自动滚动。接到这种需求后,第一时间想的是找对应的插件去完成,最后发现都不能满足,这令我很脑壳疼,最后决定自己做

过程就不说了,直接上hooks,有点简陋,哪里需要改进的,希望兄弟姐妹没批评指正。

import { ref } from 'vue'

const useScroll = (elRef: any) => {
  const el = elRef.$el

  const stopScroll = () => {
    clearInterval(timer.value)
  }

  const timer = ref<any>(null)
  const currentTop = ref(0)
  const startScroll = () => {
    stopScroll()
    timer.value = setInterval(() => {
      try {
        currentTop.value += 0.5
        // 获取内容器的高度
        const clientHeight = el.querySelector(
          '.el-scrollbar__view'
        ).clientHeight
        const height = el.clientHeight
        const pointHeight = clientHeight - height
        if (pointHeight <= currentTop.value) {
          currentTop.value = 0
        }
        elRef.setScrollTop(currentTop.value)
      } catch (error) {
        // console.log(error)
      }
    }, 20)
  }

  // 当鼠标移入的时候停止滚动
  el.addEventListener('mouseover', () => {
    stopScroll()
  })

  // 当鼠标移出的时候继续滚动
  el.addEventListener('mouseleave', () => {
    // 当鼠标在元素中滚动之后,计算出最后高度再从最终高度开始
    currentTop.value = parseInt(
      el.querySelector('.el-scrollbar__wrap').scrollTop
    )
    startScroll()
  })

  startScroll()

  return {
    stopScroll,
    startScroll,
  }
}

export default useScroll

食用方式:

<template>
  <el-table
    ref="elTableRef"
    :data="tableData"
    :style="width"
    :height="height"
    :border="true"
  >
  <!-- code -->
  </el-table>
</template>

<script setup lang="tsx">
import { ref, onMounted } from 'vue'
import useScroll from '@/hooks/useScroll'
const elTableRef = ref<any>({})

onMounted(() => {
  useScroll(elTableRef.value)
})
</script>

这样就可以自己滚动了,顺便说一下也适用于被<el-scrollbar></el-scrollbar>组件包裹的元素,ref挂在当前el-scrollbar组件上即可

<el-scrollbar height="30vh" ref="elScrollbarRef">
  <!-- code -->
</el-scrollbar>

使用方式一样。

现在存在的问题:

  1. 因为element-plus的虚拟滚动不能判断组件内元素的高度,并且end-reached事件现在有bug所以不能做,但是实现的方式也挺简单的,监听它的触底事件,停止或者重新开始滚动。
  2. 滚动不够丝滑,因为只是简单的滚动动画,所以不够平滑,如果有更好的方案麻烦私聊我。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值