请参阅对最终表单的文档进行here
我正在处理一个显然由React最终表单提供支持的表单。在表单组件中,我正在从API服务器中获取数据,响应主体包括以下内容:
{
"configs": {
"name": "abc",
"display.name": "Abc",
"value": 12,
"read.only": true
}
}
我们可以看到configs
中有四个不同的键/值对。 react最终形式可以很好地显示name
和value
之类的值,但不能显示display.name
和read.only
之类的值,因为它们的键中有一个点-> .
我知道我可以使用下划线等方式更改这些点(.
),并且可以使用。但是问题是我们的后端开发人员说后端使用点(.
)来分隔键名是很常见的,因此用其他分隔符代替点将不是一种选择。
我目前正在前端用下划线替换这些分隔符,但是这种逻辑无处不在,我认为应该有一种更好的方法来解决。谢谢!
答案 0 :(得分:1)
我认为答案是最终形式不支持带点的键。 Final Form需要某种方式来知道何时进一步深入表单值对象。
我能想到的唯一解决方案是以某种方式告诉最终表单使用另一个字符( )(类似于在VIM中进行搜索和替换时如何选择其他“分隔符”字符)作为“点”。因此,您可以将显示名称命名为<Field name="configs/display.name" delimiter="/"/>
,但这感觉就像是一个极端的情况。
长期来说,我想允许为每个领域提供一种类型安全的获取/设置镜头,这也将解决此问题。
希望我对你有个好消息...?
答案 1 :(得分:1)
由于同时使用了严格的后端命名和Final Form点键嵌套表示法,除非您可以更改这两个参数之一,否则我认为用下划线替换点仍然是最简单的解决方案。 这实际上与编码本身无关,因为基本上有3种情况:
const JSONMiddleware = input => (
Object.entries(input).reduce((ac, cv) => {
const newKey = cv[0].replace('.', '_')
ac[newKey] = cv[1]
return ac
}, {})
)
就用户体验而言,这可能不是最佳选择,但由于问题及其解决方案属于同一开发范围,因此维护起来更容易。