私はantdの形式に苦労しています。このフォームにこの選択フィールドがあり、onChangeから値を取得したいのですが、どういうわけか適切に動作しません。
これは私が値を求めているアイテムだと言う
<FormItem
{...formItemLayout}
label={fieldLabels.qcategoryid}
validateStatus={categoryError ? "error" : ""}
help={categoryError || ""}
>
{getFieldDecorator("qcategoryid", {
rules: [{ required: true, message: "Please select Category!" }],
onChange: this.handleCategoryChange
})(<Select>{categoryOptions}</Select>)}
</FormItem>
これはcategoryOptionsです
if (this.props.categories) {
categoryOptions = this.props.categories.map(item => (
<Select.Option
key={item.categoryid}
value={item.categoryid}
name={item.categoryname}
>
{item.categoryname}
</Select.Option>
));
}
カテゴリの名前とIDの両方が必要なので、onChangeという名前のhandleCategoryChangeを作成し、必要なフィールドを取得できます。
しかし、適切に選択するには、フィールドを2回クリックする必要があるようです。一度クリックすると、コンソールに表示されます。ただし、フォームのフィールドは空のままです。もう一度クリックすると、フォームにもフィールドが表示されます。
だから、私はここで間違っていますか?ああ、そうだ!これがhandleCategoryChange関数です
handleCategoryChange = (value, e) => {
console.log("value is : ", value);
console.log("e : ", e);
this.props.form.setFieldsValue({ qcategoryid: value });
this.setState({
categorySelected: value,
categoryname: e.props.name
});
};
明確にするためです。 [送信]をクリックする前に、これらの値が必要です。送信しません。
これを試して:
<FormItem
{...formItemLayout}
label={fieldLabels.qcategoryid}
validateStatus={categoryError ? "error" : ""}
help={categoryError || ""}
>
{getFieldDecorator("qcategoryid", {
rules: [{ required: true, message: "Please select Category!" }]
})(<Select onChange={this.handleCategoryChange}>{categoryOptions}</Select>)}
</FormItem>
そして、handleCategoryChange関数で
handleCategoryChange = (value, e) => {
this.setState({
categorySelected: value,
categoryname: e.props.name
});
};
基本的に、onChangeをgetFieldDecoratorヘルパーからSelectに変更します。これにより、antdの自然な動作を混乱させず、値を取得して状態を変更します。
この回答は、彼らのウェブサイトの登録フォームのコードに基づいています。具体的には、handleWebsiteChange関数
https://ant.design/components/form/#components-form-demo-register
私はこれが非常に遅いことを理解していますが、私はこれがOPが探していたものだと思います:
フォーム上のフィールドを動的に設定するには、例えばコールバック経由の子では、使用できます
this.props.form.setFields({
user: {
value: values.user,
errors: [new Error('forbid ha')],
},
});
選択した値の子から呼び出した親定義handleSelect
メソッド内。エラーフィールドを渡したくない場合は、代わりにsetFieldsValue
を使用できます