找回密码
 立即注册

QQ登录

只需一步,快速开始

樱花飞舞

注册会员

8

主题

21

帖子

69

积分

注册会员

积分
69
最新发帖
樱花飞舞
注册会员   /  发表于:2024-3-20 16:05  /   查看:664  /  回复:6
5金币
本帖最后由 Richard.Huang 于 2024-3-22 12:03 编辑

产品:SpreadJS
版本:V16.2.6

又遇到了 就是
  1. const [flag,setFlag] = useState();
  2.   const designerInitialized = (designer) => {
  3.     setFlag('1212');
  4.     const spread = designer.getWorkbook();
  5.     const sheet = spread.getSheet(0);
  6.     sheet.bind(GC.Spread.Sheets.Events.EditEnded,function(sender,args){
  7.       console.log(flag)
  8.     })
  9.   }
  10.   var config = GC.Spread.Sheets.Designer.DefaultConfig;
  11.   return (
  12.     <Designer styleInfo = {{width: "100%", height: '98vh'}} designerInitialized={designerInitialized} config = {config}   spreadOptions = {{sheetCount: 2}}></Designer>
  13.   );
复制代码
编辑结束的打印的flag并不是最新的 我上面已经给他复制为1212了但是还是undefined
企业微信截图_1710921686393.png
企业微信截图_17109215807084.png105289916.png

最佳答案

查看完整内容

因为config是你创建组件时建好的闭包, 而button每次触发事件的时候react会给button组件触发新的状态, config不会被react更新, 除非你给config配置一个react组件作为designer的子组件, 或者就是用上面的useRef

6 个回复

倒序浏览
最佳答案
最佳答案
刘老太
注册会员   /  发表于:2024-3-20 16:05:09
来自 5#
樱花飞舞 发表于 2024-3-20 17:55
我在外面写了一个button点击是最新的状态 点击自定义工具栏里面打印的确是之前的

因为config是你创建组件时建好的闭包, 而button每次触发事件的时候react会给button组件触发新的状态, config不会被react更新, 除非你给config配置一个react组件作为designer的子组件, 或者就是用上面的useRef

评分

参与人数 2金币 +300 满意度 +5 收起 理由
Joestar.Xu + 300 很给力!
樱花飞舞 + 5

查看全部评分

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-20 17:34:59
2#
您好,这是一个React框架 useState 异步回调获取不到最新值的问题,与SpreadJS无关。

我在网上搜索了一下,您可以参考以下方案来解决这个问题:

https://juejin.cn/post/7019482437373657101
https://blog.csdn.net/dejfwewf/article/details/126103196

评分

参与人数 1满意度 +5 收起 理由
樱花飞舞 + 5

查看全部评分

SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
刘老太
注册会员   /  发表于:2024-3-20 17:47:28
3#
被闭包抓着了, 你用useRef取一下最新值就行
  1.   const [flag, setFlag] = useState();
  2.   const flagRef = useRef();
  3.   useEffect(() => {
  4.     flagRef.current = flag;
  5.   }, [flag]);
  6.   const designerInitialized = (designer) => {
  7.     setFlag('1212');
  8.     const spread = designer.getWorkbook();
  9.     const sheet = spread.getSheet(0);
  10.     sheet.bind(GC.Spread.Sheets.Events.EditEnded, () => {
  11.       console.log(flagRef.current);
  12.     });
  13.   };
复制代码
回复 使用道具 举报
樱花飞舞
注册会员   /  发表于:2024-3-20 17:55:46
4#
我在外面写了一个button点击是最新的状态 点击自定义工具栏里面打印的确是之前的
企业微信截图_17109284552453.png425088195.png
回复 使用道具 举报
樱花飞舞
注册会员   /  发表于:2024-3-20 18:07:36
6#
刘老太 发表于 2024-3-20 17:47
被闭包抓着了, 你用useRef取一下最新值就行

大佬  可以解释一下他是怎么抓着的嘛 抓着是什么意思呐
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-3-21 17:32:18
7#
刘老太 发表于 2024-3-20 18:07
因为config是你创建组件时建好的闭包, 而button每次触发事件的时候react会给button组件触发新的状态, con ...

SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部