Skip to content

Conversation

@kaokei
Copy link

@kaokei kaokei commented Dec 11, 2025

类似于JSON.stringify(value, replacer),期望可以提供一个replacer函数来自定义序列化某些数据。

@leezng
Copy link
Owner

leezng commented Dec 15, 2025

@kaokei 对节点做序列化,可以使用renderNodeKey、renderNodeValue

@kaokei
Copy link
Author

kaokei commented Dec 15, 2025

我一开始也是这么认为的,但是效果并不是我想要的。
对比JSON.stringify的实现,其中replacer可以实现将一个类的实例对象渲染成一个字符串或者数字。

但是咱们这个组件其实并没有依赖JSON.stringify来实现序列化,其实是依赖的jsonFlatten这个工具函数实现的序列化。
目前这个函数会自动把实例对象当作对象来处理,自然也就是渲染成这个对象的所有实例属性。
正常情况下,这个策略是符合预期的。但是在需要自定义渲染逻辑的时候,就不能满足需求了。

比如我期望可以在渲染json的时候支持bigint,我已经借助第三方parser把一个含有大数字的json字符串转换成一个json对象了。
这个json对象在处理bigint数字时会以自定义类CustomBigInt的实例对象来表示,其中value属性是一个字符串,也就是需要渲染的那个特别大的数字。

我现在的处理方案就是借助replacer这个新增加的函数来处理CustomBigInt的渲染逻辑。
主要是在返回了一个二元tuple,第一个元素是类型,功能相当于是getDataType函数的作用,第二个元素是需要真实渲染的内容。
比如针对CustomBigInt实例对象的返回值就是['number', '9999999999特别大的数字']

这样最终就能实现咱们的组件可以支持自定义渲染json对象了。
而且目前的逻辑应该是向前兼容的,不会导致破坏性更新。

@kaokei
Copy link
Author

kaokei commented Dec 16, 2025

简单来说就是可以实现自定渲染一个复杂json对象。
假设现在有一个复杂的json对象。

{
"name": "BigJsonData",
"bigNumber": new CustomBigNumber('999999999999999999999999999999999999')
}

再假设CustomBigNumber有自己的实例属性name,type,value

那么目前咱们组件渲染这个json对象的最终结果如下所示:

{
"name": "BigJsonData",
"bigNumber": {
  "name": "CustomBigNumber",
  "type": "number",
  "value": "999999999999999999999999999999999999"
}
}

如果可以支持自定义replacer,那么可以实现如下的渲染效果:

{
"name": "BigJsonData",
"bigNumber": 999999999999999999999999999999999999
}

@leezng
Copy link
Owner

leezng commented Dec 19, 2025

看看能否通过修改slots实现呢?我觉得引入replacer,它的作用有点与原来的slots重叠了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants