reactjs Ant设计重置选择

cbeh67ev  于 2023-02-18  发布在  React
关注(0)|答案(6)|浏览(200)

我有2个<Select>。第二个中的值取决于第一个中的选择。当我更改第一个中的选定项时,第二个中的可用选项将更新。但如果我已经在第二个中进行了选择,则该选项将保持选中状态,即使根据对第一个选择的更改该选项不应可用。
当对第一个选择进行更改时,如何将第二个选择重置为未选择任何内容?
第一次选择:

<FormItem {...formTailLayout}>
    <FormTitle>Operation</FormTitle>
    {getFieldDecorator('Operation', {
    rules: [
        {
        required: true
        }
    ]
    })(
    <Select
        showSearch
        placeholder="Select an option"
        onChange={this.handleOperationChange}
    >
        {operations.map(operation => (
        <Option value={operation.operation_id}>
            {operation.operation_name}
        </Option>
        ))}
    </Select>
    )}
</FormItem>

第二次选择:

<FormItem {...formTailLayout}>
    <FormTitle>Metric</FormTitle>
    {getFieldDecorator('Metric', {
    rules: [
        {
        required: true
        }
    ]
    })(
    <Select
        showSearch
        placeholder="Select an operation first"
        onChange={this.handleMetricChange}
    >
        {matrics
        .filter(
            metric => metric.operation_fk === operation_fk
        )
        .map(metric => (
            <Option value={metric.metric_name}>
            {metric.metric_name}
            </Option>
        ))}
    </Select>
    )}
</FormItem>
s6fujrry

s6fujrry1#

你需要看一下Ant Design页面上提到的协调控件的例子,你可以简单地在你的第一个onChange方法中使用setFieldsValue来设置第二个选择字段的值。

handleOperationChange = () => {
    this.props.form.setFieldsValue({
        Metric: undefined
    })
}

我创建了一个sandbox demo

4ngedf3f

4ngedf3f2#

在antd中,在类组件中,使用引用,清除或重置选择列表值或表单项值
1.在类组件下面添加formRef = React.createRef();,例如:
export default class TestClass extends Component { formRef = React.createRef(); }
1.将ref={this.formRef}添加到<Form />组件中,如下所示<Form ref={this.formRef}/>
1.添加这一行在btn单击或在任何功能你想要的
this.formRef.current.setFieldsValue({ network: undefined });
1.其中,上一步中的network是表单项的名称
<Form.Item name="network" label="Network"></Form.Item>

gojuced7

gojuced73#

在handleOperationChange方法中使用resetfileds,这将重置第二个选择框。

this.props.form.resetFields('Metric');
qij5mzcb

qij5mzcb4#

<Select
    className="mt-3"
    style={{ width: "100%" }}
    placeholder="Select your Sub Category"
    onChange={handleChangeSubCategory}
    disabled={categoryGroup.category === null}
    value={categoryGroup.subcategory || undefined}
 >
    {subCategory.map(item => (
      <Option key={item} value={item} label={item}>
         <div>
            <Avatar style={{ background: "#10899e" }}>
               {item[0]}
            </Avatar>{" "}
                {item}
             </div>
       </Option>
       ))}
</Select>
mbyulnm0

mbyulnm05#

如果使用功能组件,则可以使用Form

const [form] = Form.useForm()

并且可以如下清除值:

const someMethodToClearCurrentSelection = () => {
    // ... the code is omitted for the brevity
    form.setFieldsValue({ fooProduct: undefined })
}

我们的控件是这样的:

<Form form={form} name="basic" onFinish={onFinish} layout="vertical">
<Form.Item
    key="fooProduct"
    name="fooProduct"
    label="Some product"
    className={s.fooContainer}
    rules={[
        {
            required: true,
            message: `Field 'Some produc' is required`,
        },
    ]}
>
    <Select
        showSearch
        optionFilterProp="children"
        filterOption={(input, option) =>
            option?.children.toLowerCase().includes(input.toLowerCase())
        }
        allowClear
        onChange={handleMarkClick}
    >
        {products.map((option) => (
            <Option key={option.id} value={option.id}>
                {option.name}
            </Option>
        ))}
    </Select>
</Form.Item>

Read more in antd docs hereexamples while migrating from v3 to v4

lpwwtiir

lpwwtiir6#

你可以使用useEffect()钩子。为你的表单定义一个useForm()自定义钩子。例如:const [表单]=表单. useForm();'将第一个和第二个选择框 Package 在窗体内,并使用定义窗体上的输入。每当第一个选择框的输入发生变化时,清除useEffect()钩子中的第二个选择框的值。例如:<Form.Item> to define the input on the form. And whenever the first select's input is changed, clear the 2nd select values in useEffect() hook. Example:

useEffect(() => {
    form.setFieldsValue({
      marketplace: [] //2nd select name
    });
  }, [selectedRegion]); //first select's value

这工作很适合我。

相关问题