X6
X6 copied to clipboard
有些情况下 监听不到数据的更新
问题描述

重现链接
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
@NewByVector 大佬能麻烦看下这个问题吗
因为你使用的是 deep: true
模式,也就是对象 merge,所以 xxx 属性的对象引用不会改变的,因此识别不出来数据的改变。
因为你使用的是
deep: true
模式,也就是对象 merge,所以 xxx 属性的对象引用不会改变的,因此识别不出来数据的改变。
@NewByVector 我看代码 有 updateData 之前没发现 使用这个可以了, 但是 setData 支持 merge 我感觉 应该 也能 跟 updateData 一样 触发更新吧
@JoeABCDEF 现在检测更新是根据对象引用判断的。不过这里确实要思考一下,对象改变检测机制。
@NewByVector
是否可以考虑引入immutable js
或者immer
这样的第三方的实现来管理x6内部的数据呢?或者在x6内部使用一个最小的类似的实现?以避免数据引用带来的问题。
我也遇到这个问题了, 更新数组的时候。 如果数组已有4个数据,当我setData数组为2个数据时,数据更新会失败。
查看源码发现是调用lodash merge函数深度合并这里出了问题。
临时方案是调用updateData函数或者setData(data, { deep: false });