You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+antd动态表单:基于字段值控制输入框禁用状态

解决方案

问题出在你用单个状态变量控制所有价格输入框的禁用状态,导致所有字段同步变化。正确的做法是让每一组表单字段单独维护自身的价格框禁用状态,把禁用状态存在表单数组的每一项数据中。

步骤1:调整表单初始数据结构

给每一项表单数据添加priceDisabled字段,初始值设为true,表示价格框默认禁用:

const [form] = Form.useForm();

// 初始表单数据
const initialValues = {
  fields: [
    { sight: '', price: '', priceDisabled: true },
  ],
};

步骤2:处理sight选择的 onChange 事件

在sight的选择框 onChange 时,找到当前对应的表单项,将其priceDisabled设为false,仅启用当前项的价格框:

const handleSightChange = (index, value) => {
  form.setFieldsValue({
    [`fields[${index}].sight`]: value,
    [`fields[${index}].priceDisabled`]: false,
  });
};

步骤3:绑定价格输入框的 disabled 属性

将价格输入框的disabled属性绑定到对应表单项的priceDisabled字段:

<Form.Item
  name={[`fields`, index, `price`]}
  rules={[{ required: true, message: '请输入价格' }]}
>
  <InputNumber
    style={{ width: '100%' }}
    disabled={form.getFieldValue([`fields`, index, `priceDisabled`])}
    placeholder="价格"
  />
</Form.Item>

步骤4:处理新增字段逻辑

新增字段时,保证新添加的项默认priceDisabled为true:

const addField = () => {
  const fields = form.getFieldValue('fields');
  form.setFieldsValue({
    fields: [...fields, { sight: '', price: '', priceDisabled: true }],
  });
};

这样修改后,每一组sight和价格字段都是独立控制的,选择某个sight后只会启用对应的价格输入框,不会影响其他字段。

内容的提问来源于stack exchange,提问作者Ranjan Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:54:57