请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

潘嗒嗒

注册会员

8

主题

26

帖子

90

积分

注册会员

积分
90
潘嗒嗒
注册会员   /  发表于:2025-3-10 11:39  /   查看:62  /  回复:3
3金币
2025-03-10_113513.jpg891809387.png

我有这么一个下拉数据滚动功能,现在遇到一个问题就是联动下拉比较卡顿,对比不联动下拉的情况确实有性能差异。
我用的是vue2+spreadjs 17.0.2

核心代码如下:
  1. activeSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
  2.                         //垂直滚动同步
  3.                         that.newTopRow = args.newTopRow
  4.                         let rsheet = that.RightExcelSpread.getSheet(0)
  5.                         rsheet.showRow(args.newTopRow, GC.Spread.Sheets.VerticalPosition.top);
  6.                     });
  7. activeSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
  8.                         //将显示的sheet1的第一行设置到sheet2(垂直滚动同步)
  9.                         // sheet2.showRow(args.newTopRow, GC.Spread.Sheets.VerticalPosition.top);
  10.                         that.newTopRow = args.newTopRow
  11.                         let lsheet = that.LeftExcelSpread.getSheet(0)
  12.                         lsheet.showRow(args.newTopRow, GC.Spread.Sheets.VerticalPosition.top);
  13.                     });

复制代码
模板在附件中,请帮忙看下

Drilldown_Report_FM (3).zip

273.42 KB, 下载次数: 1

最佳答案

查看完整内容

您好,showRow这个函数本身的性能就比较差,而滚动的监听会频繁触发,showRow又会触发另一个sheet的滚动监听,所以会导致卡顿。 建议您采用类似防抖的方式来实现联动滚动的效果,减少showRow的调用次数,这样可以显著改善卡顿的情况,参考代码如下:

3 个回复

倒序浏览
最佳答案
最佳答案
Matthew.Xue
超级版主   /  发表于:2025-3-10 11:39:49
来自 2#
您好,showRow这个函数本身的性能就比较差,而滚动的监听会频繁触发,showRow又会触发另一个sheet的滚动监听,所以会导致卡顿。
建议您采用类似防抖的方式来实现联动滚动的效果,减少showRow的调用次数,这样可以显著改善卡顿的情况,参考代码如下:
  1. let leftSheet = leftSpread.getSheetFromName("Left")
  2. let rightSheet = rightSpread.getSheetFromName("Right")

  3. let leftTimer, rightTimer
  4. let time = 50
  5. leftSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
  6.     clearTimeout(leftTimer)
  7.     leftTimer = setTimeout(() => {
  8.         rightSheet.suspendEvent()
  9.         rightSheet.showRow(args.newTopRow, GC.Spread.Sheets.VerticalPosition.top);
  10.         rightSheet.resumeEvent()
  11.     }, time);
  12. });
  13. rightSheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
  14.     clearTimeout(rightTimer)
  15.     rightTimer = setTimeout(() => {
  16.         leftSheet.suspendEvent()
  17.         leftSheet.showRow(args.newTopRow, GC.Spread.Sheets.VerticalPosition.top);
  18.         leftSheet.resumeEvent()
  19.     }, time);
  20. });
复制代码

回复 使用道具 举报
潘嗒嗒
注册会员   /  发表于:2025-3-10 15:35:50
3#
Matthew.Xue 发表于 2025-3-10 14:52
您好,showRow这个函数本身的性能就比较差,而滚动的监听会频繁触发,showRow又会触发另一个sheet的滚动监 ...

好的明白,确实有很明显的改善,因为有防抖的原因另外一个sheet会一瞬明显的停顿
回复 使用道具 举报
Matthew.Xue
超级版主   /  发表于:2025-3-10 16:54:27
4#
潘嗒嗒 发表于 2025-3-10 15:35
好的明白,确实有很明显的改善,因为有防抖的原因另外一个sheet会一瞬明显的停顿

是的,您也可以改成节流,每500毫秒更新一次另一个sheet的滚动位置,但是实时显示肯定是会卡顿的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部