Amis表单中如何动态隐藏字段,但保持提交时的初始值?

司马松奇 阅读 20

我在用Amis做表单时遇到个问题:有个包含开关的表单,当切换开关时需要隐藏几个字段。但发现隐藏后这些字段的初始值在提交时会变成空,而不是它们的初始值。我尝试过用visibleOn控制显示,同时在api配置里写了valueNames包含所有字段,但没效果。有没有人知道该怎么让隐藏的字段在提交时保留初始值?

比如这样配置的表单:


{
  "type": "form",
  "api": "/submit",
  "controls": [
    { "type": "switch", "name": "showFields", "value": true },
    {
      "type": "input-text",
      "name": "hiddenField",
      "visibleOn": "!data.showFields",
      "value": "初始值"
    }
  ]
}

当我把开关关掉后,hiddenField虽然隐藏了,但提交时它的值变成了空字符串,而不是初始的”初始值”。这应该怎么处理?

我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
子晴
子晴 Lv1
这个问题挺常见的,是 Amis 的字段隐藏机制导致的默认行为。表单在提交时,会根据当前表单的状态来决定哪些字段需要提交。当你用 visibleOn 控制字段隐藏时,Amis 会认为这些字段“不在表单中”,从而跳过它们的值提交。

你提到在 api 里加了 valueNames,这个思路是对的,但还不够。因为你还需要告诉 Amis:即使这些字段不可见,也“始终参与提交”。

下面是修正后的配置方式,保留你原来的结构,只改关键点:

{
"type": "form",
"api": {
"method": "post",
"url": "/submit",
"data": {
"valueNames": ["showFields", "hiddenField"]
}
},
"body": [
{
"type": "switch",
"name": "showFields",
"value": true
},
{
"type": "input-text",
"name": "hiddenField",
"visibleOn": "!data.showFields",
"value": "初始值",
"submitOnChange": false,
"static": true
}
]
}


关键点说明:

1. **static: true**:这个配置告诉 Amis,即使字段不可见,它的值也始终保留不变,且参与提交。
2. **submitOnChange: false**:防止字段值变化时触发表单提交,避免副作用。
3. **valueNames 明确列出字段**:确保后端接收时这些字段始终存在。

这样配置之后,即使 hiddenField 被隐藏了,它的值也会保持为“初始值”,并且在表单提交时会被包含进去。

遇到类似问题,建议打开浏览器的 Network 面板,看看实际提交的数据是什么,有助于快速定位问题。
点赞 7
2026-02-04 20:01