X6 icon indicating copy to clipboard operation
X6 copied to clipboard

有些情况下 监听不到数据的更新

Open JoeABCDEF opened this issue 2 years ago • 6 comments

问题描述

image 注释掉的那三种 setData 的更新 都不能正常 被监听到 但是实际改变了

重现链接

https://codesandbox.io/s/mo-ban-forked-kjqoh3?file=/src/App.tsx

重现步骤

https://codesandbox.io/s/mo-ban-forked-kjqoh3?file=/src/App.tsx

预期行为

只要改变就能监听到, 除非是 slient: true 监听不到

平台

  • 操作系统: macOS
  • 网页浏览器: Google Chrome
  • X6 版本: 2.2.0

屏幕截图或视频(可选)

No response

补充说明(可选)

No response

JoeABCDEF avatar Feb 02 '23 09:02 JoeABCDEF

@NewByVector 大佬能麻烦看下这个问题吗

JoeABCDEF avatar Feb 02 '23 09:02 JoeABCDEF

因为你使用的是 deep: true 模式,也就是对象 merge,所以 xxx 属性的对象引用不会改变的,因此识别不出来数据的改变。

NewByVector avatar Feb 06 '23 09:02 NewByVector

因为你使用的是 deep: true 模式,也就是对象 merge,所以 xxx 属性的对象引用不会改变的,因此识别不出来数据的改变。

@NewByVector 我看代码 有 updateData 之前没发现 使用这个可以了, 但是 setData 支持 merge 我感觉 应该 也能 跟 updateData 一样 触发更新吧

JoeABCDEF avatar Feb 06 '23 14:02 JoeABCDEF

@JoeABCDEF 现在检测更新是根据对象引用判断的。不过这里确实要思考一下,对象改变检测机制。

NewByVector avatar Feb 06 '23 14:02 NewByVector

@NewByVector 是否可以考虑引入immutable js或者immer这样的第三方的实现来管理x6内部的数据呢?或者在x6内部使用一个最小的类似的实现?以避免数据引用带来的问题。

lloydzhou avatar Feb 14 '23 05:02 lloydzhou

我也遇到这个问题了, 更新数组的时候。 如果数组已有4个数据,当我setData数组为2个数据时,数据更新会失败。 查看源码发现是调用lodash merge函数深度合并这里出了问题。 17

临时方案是调用updateData函数或者setData(data, { deep: false });

vok123 avatar Feb 26 '24 10:02 vok123