react-select 只包含表单中的值,而不是 value: '' 和 label: ''
react-select to just include values in form, rather than value: '' and label: ''
我将 react-select
包括在我的 rails 项目中,在 redux-form
中,它一切正常,除了我提交表单的后端没有像 {value, label}
、
我希望我的表单域只包含一个值列表。
这是我的表单代码:
export const renderTagsSelect = props => {
const { input, initialValues } = props;
return (
<Creatable
{...props}
value={input.value || initialValues}
resetValue={initialValues}
onChange={value => input.onChange(value)}
onBlur={() => input.onBlur(input.value)}
/>
);
};
render() {
<form onSubmit={handleSubmit(doSaveItem)}>
<Title>Modifica Item</Title>
<Field
name="title"
label="Titolo"
component={renderInput}
validate={required()}
/>
<br />
<span>Tags</span>
<br />
<TagsFormSelector name="tag_list" tags={item.tag_list} />
<SubmitButton type="submit" disabled={pristine || submitting}>
Salva modifiche
</SubmitButton>
</form>
}
提交时,表单生成的JSON是这样的:
"tag_list": [
{
"label": "cena",
"value": "cena"
},
{
"label": "Paesaggi cittadini",
"value": "Paesaggi cittadini"
}
],
我的后端是在 rails 和 acts_as_taggable_on
中实现的,更喜欢接收这样的东西:
"tag_list: ["cena", "Paesaggi cittadini"]
对于未优化的这可能是,我更喜欢让后端驱动 API。
任何线索如何实现这一目标?
您只需将函数引用传递给 onSubmit
属性,您可以创建一个新函数在调用 handleSubmit
之前格式化数据:
<form onSubmit={this.onSubmit}>
并且在您的 onSubmit
函数中:
onSubmit = (tags) => {
const { handleSubmit } = this.props;
const submitValues = tags.map((tag) => tag.value);
handleSubmit(submitValues); // you can also pass doSaveItem here
}
根据 kuiro5 的建议,我用 normaliseData
函数修复了它:
在 form
中:
<form onSubmit={handleSubmit(doSaveItem)}>
[..]
<TagsFormSelector name="js_tag_list" tags={item.tag_list} />
[..]
在 doSaveItem
中:
const doSaveItem = (data, dispatch, props) => {
normaliseData(data);
return dispatch(saveItem(props.item.id, data)).catch(response => {
throw new SubmissionError(f.errorsFromProps(response));
});
};
normaliseData
:
const normaliseData = data => {
data["js_tag_list"] &&
(data["tag_list"] = data["js_tag_list"].map(tag => tag.value));
和其他数据规范化。
这让它起作用了。
我将 react-select
包括在我的 rails 项目中,在 redux-form
中,它一切正常,除了我提交表单的后端没有像 {value, label}
、
我希望我的表单域只包含一个值列表。
这是我的表单代码:
export const renderTagsSelect = props => {
const { input, initialValues } = props;
return (
<Creatable
{...props}
value={input.value || initialValues}
resetValue={initialValues}
onChange={value => input.onChange(value)}
onBlur={() => input.onBlur(input.value)}
/>
);
};
render() {
<form onSubmit={handleSubmit(doSaveItem)}>
<Title>Modifica Item</Title>
<Field
name="title"
label="Titolo"
component={renderInput}
validate={required()}
/>
<br />
<span>Tags</span>
<br />
<TagsFormSelector name="tag_list" tags={item.tag_list} />
<SubmitButton type="submit" disabled={pristine || submitting}>
Salva modifiche
</SubmitButton>
</form>
}
提交时,表单生成的JSON是这样的:
"tag_list": [
{
"label": "cena",
"value": "cena"
},
{
"label": "Paesaggi cittadini",
"value": "Paesaggi cittadini"
}
],
我的后端是在 rails 和 acts_as_taggable_on
中实现的,更喜欢接收这样的东西:
"tag_list: ["cena", "Paesaggi cittadini"]
对于未优化的这可能是,我更喜欢让后端驱动 API。
任何线索如何实现这一目标?
您只需将函数引用传递给 onSubmit
属性,您可以创建一个新函数在调用 handleSubmit
之前格式化数据:
<form onSubmit={this.onSubmit}>
并且在您的 onSubmit
函数中:
onSubmit = (tags) => {
const { handleSubmit } = this.props;
const submitValues = tags.map((tag) => tag.value);
handleSubmit(submitValues); // you can also pass doSaveItem here
}
根据 kuiro5 的建议,我用 normaliseData
函数修复了它:
在 form
中:
<form onSubmit={handleSubmit(doSaveItem)}>
[..]
<TagsFormSelector name="js_tag_list" tags={item.tag_list} />
[..]
在 doSaveItem
中:
const doSaveItem = (data, dispatch, props) => {
normaliseData(data);
return dispatch(saveItem(props.item.id, data)).catch(response => {
throw new SubmissionError(f.errorsFromProps(response));
});
};
normaliseData
:
const normaliseData = data => {
data["js_tag_list"] &&
(data["tag_list"] = data["js_tag_list"].map(tag => tag.value));
和其他数据规范化。
这让它起作用了。