闽公网安备 35020302035485号
最近有一个小需求,我们的 antd 表格显示不够,但是我们展示的有些东西能让用户更眼前一亮,产品说,这个表格要滚动起来,我想了想,虽然自己不太厉害,但是这个功能明显可以实现的,毕竟好的产品才是竞争力,只要需求合理,把东西做好也是我们开发义不容辞的事情,自然不会推辞,这么一个小功能一会就搞完了,直接就开始干。
接下来就是一步一步实施完成我们的功能。
<Table
columns={columns}
dataSource={list}
scroll={{ y: 200 }}
pagination={false} />
const table = document.getElementsByClassName('ant-table-body')[0];
const timerRef = useRef<NodeJS.Timeout | null>(null)
// 堆代码 duidaima.com
//开始滚动
const autoScrollTable = () => {
const table = document.getElementsByClassName('ant-table-body')[0];
if (!table || !list || list.length < 3) return
timerRef.current && clearInterval(timerRef.current) //如果有清除一下,避免开两个计时器
timerRef.current = setInterval(() => {
table.scrollTop++; //在计时器中累加,形成向下滑动效果
if (Math.ceil(table.scrollTop) >= table.scrollHeight - table.clientHeight) {
// 滚动条到底后重新开始
table.scrollTop = 0;
}
}, 30)
}
//结束滚动
const stopScrollTable = () => {
timerRef.current && clearInterval(timerRef.current)
}
上面只需要我们获取完毕数据时,然后开启滚动即可,退出时结束滚动。
可能会有人问,时间怎么定义呢,时间当然是我们眼睛看着不难受即可,一般 60帧 是我们感觉到流畅的视频或者动画,30帧 也还不错,我们的计时器间隔实际上就是 1000 / 帧数(单位:ms),我们取30~60帧左右都行,看着没问题就行了,这里取了 30ms(大约33帧),实际上自己调节就行(60帧我们需要调整到16),自己根据情况调整,时间越短越流畅,但带来的性能开销也越大,自己平衡就是了。
有人可能会问,timer 如果有活动,这个动画就不连贯就不好看了,实际上我们展示这个数据,一般不会操作时才滚动,操作时滚不滚动、停不停顿都没影响。如果想做更流畅动画,那么requestAnimationFrame、cancelAnimationFrame这个使用还是不错的,当然有轮子的话我们不做岂不是更好。
<div
onMouseEnter={stopScrollTable}
onMouseLeave={autoScrollTable}>
<Table
columns={columns}
dataSource={list}
scroll={{ y: 200 }}
pagination={false} />
</div>