找回密码
 立即注册

QQ登录

只需一步,快速开始

旺仔老博文

注册会员

8

主题

26

帖子

88

积分

注册会员

积分
88
旺仔老博文
注册会员   /  发表于:2024-8-21 17:41  /   查看:1188  /  回复:11
2金币
监听侧边栏,动态调整表格宽度,调用refresh方法确实可以自适应重绘,但是特别卡顿加上setTimeOut也无效

watch(
  () => appStore.layoutSetting.collapsed,
  (collapsed) => {
    if (spreadSheet.value) {
      spreadSheet.value.getHost().style.width = collapsed
        ? `${window.innerWidth - 200}px`
        : `${window.innerWidth - 400}px`;
      // spreadSheet.value.refresh();
    }
  },
);


最佳答案

查看完整内容

您好,需要看一下您是怎么定义spreadSheet的,看一下相关代码。 不建议一直使用spreadSheet.value 可以将其赋值给一个变量。

11 个回复

倒序浏览
最佳答案
最佳答案
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-8-21 17:41:27
来自 5#
您好,需要看一下您是怎么定义spreadSheet的,看一下相关代码。
不建议一直使用spreadSheet.value
image.png771805724.png
可以将其赋值给一个变量。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-8-21 17:57:00
2#
您好!跟您确认下都在什么场景下需要调用refresh方法呢?
您试下重新绘制,即Workbook:repaint()。
请参考官网API文档了解详情:https://demo.grapecity.com.cn/sp ... ts.Workbook#repaint
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:2024-8-21 17:59:16
3#
Wilson.Zhang 发表于 2024-8-21 17:57
您好!跟您确认下都在什么场景下需要调用refresh方法呢?
您试下重新绘制,即Workbook:repaint()。
请参 ...

框架中左边菜单的折叠和展开;我刚刚试过watch(
  () => appStore.layoutSetting.collapsed,
  (collapsed) => {
    if (spreadSheet.value) {
      spreadSheet.value.getHost().style.width = collapsed
        ? `${window.innerWidth - 180}px`
        : `${window.innerWidth - 400}px`;
      // setTimeout(() => {
      //   window.dispatchEvent(new Event('resize'));
      // }, 0);
    }
  },
);调用浏览器resize,虽然比refresh好多了但是还是有点卡顿
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:2024-8-21 18:09:24
4#
Wilson.Zhang 发表于 2024-8-21 17:57
您好!跟您确认下都在什么场景下需要调用refresh方法呢?
您试下重新绘制,即Workbook:repaint()。
请参 ...

repaint也试过watch(
  () => appStore.layoutSetting.collapsed,
  (collapsed) => {
    if (spreadSheet.value) {
      spreadSheet.value.getHost().style.width = collapsed
        ? `${window.innerWidth - 180}px`
        : `${window.innerWidth - 400}px`;
      // setTimeout(() => {
      //   window.dispatchEvent(new Event('resize'));
      // }, 0);
      setTimeout(() => {
        spreadSheet.value.invalidateLayout();
        spreadSheet.value.repaint();
      }, 0);
    }
  },
);用repaint不仅卡顿,连自适应也不生效
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:2024-8-22 09:21:47
6#
Ellia.Duan 发表于 2024-8-22 09:15
您好,需要看一下您是怎么定义spreadSheet的,看一下相关代码。
不建议一直使用spreadSheet.value

const spreadSheet = ref<any>(null); async function initSpread(spread?: any) {if (spread) spreadSheet.value = spread;........} <gc-spread-sheets
          v-if="spreadReady"
          id="gcBook"
          class="spreadTable"
          :hostStyle="{ width: '100%' }"
          @workbookInitialized="initSpread"
        >
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-8-22 10:13:21
7#

请尝试下面的代码,是否可以解决您的问题

  1. import {markRaw} from 'vue'

  2. spreadSheet.value = markRaw(spread)
复制代码

回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:2024-8-22 10:32:48
8#
Ellia.Duan 发表于 2024-8-22 10:13
请尝试下面的代码,是否可以解决您的问题

8watch(
  () => appStore.layoutSetting.collapsed,
  (collapsed) => {
    if (spreadSheet.value) {
      const srpeadMarkRaw = markRaw(spreadSheet.value);
      srpeadMarkRaw.getHost().style.width = collapsed
        ? `${window.innerWidth - 200}px`
        : `${window.innerWidth - 400}px`;
      setTimeout(() => {
        // window.dispatchEvent(new Event('resize'));
        srpeadMarkRaw.refresh();
      }, 0);
    }
  },
);能自适应了,但是还是卡,比之前直接refresh要好一些
回复 使用道具 举报
旺仔老博文
注册会员   /  发表于:2024-8-22 10:35:16
9#
Ellia.Duan 发表于 2024-8-22 10:13
请尝试下面的代码,是否可以解决您的问题
  1. // 处理调整大小
  2. function handleResize(collapsed) {
  3.   if (spreadSheet.value) {
  4.     const newWidth = collapsed
  5.       ? `${window.innerWidth - 200}px`
  6.       : `${window.innerWidth - 400}px`;
  7.     const host = spreadSheet.value.getHost();

  8.     if (host.style.width !== newWidth) {
  9.       host.style.width = newWidth;
  10.       window.dispatchEvent(new Event('resize')); // 触发 resize 事件
  11.     }
  12.   }
  13. }

  14. // 防抖函数实现
  15. function debounce(func, wait) {
  16.   let timeout;
  17.   return function (...args) {
  18.     clearTimeout(timeout);
  19.     timeout = setTimeout(() => func(...args), wait);
  20.   };
  21. }

  22. // 使用防抖技术优化 watch 函数
  23. const debouncedHandleResize = debounce(handleResize, 100);

  24. watch(
  25.   () => appStore.layoutSetting.collapsed,
  26.   (collapsed) => {
  27.     debouncedHandleResize(collapsed);
  28.   },
  29. );  
复制代码
用了防抖好多了,还是不丝滑
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-8-22 12:20:18
10#
如果您觉得还存在卡顿问题,是否可以录个视频以及上传一个demo ,我们根据demo为您调研方案。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部