我在我的rails项目中包含react-select
,在redux-form
内,一切正常,除了我提交表单的后端不喜欢{{1} },
我希望我的表单字段只包含一个值列表。
这是我的表单代码:
{value, label}
提交时,表单生成的JSON就像:
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>
}
我的后端是使用 "tag_list": [
{
"label": "cena",
"value": "cena"
},
{
"label": "Paesaggi cittadini",
"value": "Paesaggi cittadini"
}
],
在rails中实现的,更喜欢接收这样的内容:
acts_as_taggable_on
对于非优化的这可能是,我更喜欢让后端驱动API。
任何线索如何实现这一目标?
答案 0 :(得分:1)
您只需将函数引用传递给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
}
答案 1 :(得分:0)
根据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));
和其他数据规范化。
这使它成功了。