Skip to content

React Form Item

问题根源

在原代码中,Form.Item 的子组件是 Space,而不是直接的 Select。这导致 Form.Item 无法正确地将表单数据传递给 Select 组件。

tsx
<Form.Item>
    <Space>
        <Select />
        <Button />
    </Space>
</Form.Item>

修复方法

  • 将 Select 组件直接作为 Form.Item 的子组件,而不再嵌套在 Space 中
  • 将删除按钮,改为单独的 Button 组件并放在 Form.Item 之外
  • 如果不想把 Button 放到 Form 之外,可以使用自定义组件

为什么

  • 在 Ant Design 的 Form 组件中,Form.Item 会自动为其直接子组件提供以下功能:
  • 自动设置子组件的 value 属性(从表单数据中取值)
  • 自动绑定 onChange 事件(更新表单数据)
  • 自动处理表单验证
  • 当 Select 是 Form.Item 的直接子组件时,Form.Item 可以正确控制 Select 的值
  • Form.Item 的 name 属性 [name, 'severity'] 能正确索引到 Form.List 中的数据
  • Select 是 Form.Item 的直接子组件,可以接收到正确的值
  • 当编辑表单时,form.setFieldsValue 设置的值会正确传递给 Select

通过这个修改,当点击编辑时,告警条件中的 severity 下拉框应该能正确显示数据了。

自定义组件

tsx
const SelectWithButton: React.FC<{
  value?: number;
  onChange?: (value: number) => void;
  onDelete: () => void;
  options: { label: string; value: number }[];
  placeholder?: string;
  style?: React.CSSProperties;
}> = ({ value, onChange, onDelete, options, placeholder, style }) => (
  <Space align="baseline">
    <Select
      value={value}
      onChange={onChange}
      options={options}
      placeholder={placeholder}
      style={style}
    />
    <MinusCircleOutlined
      onClick={onDelete}
      style={{ color: '#ff4d4f' }}
    />
  </Space>
);

<Form.Item>
    <SelectWithButton>
</Form.Item>