react-select只包含表单中的值,而不是值:''和label:''

时间:2018-04-13 13:39:38

标签: reactjs redux-form acts-as-taggable-on react-select

我在我的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。

任何线索如何实现这一目标?

2 个答案:

答案 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));

和其他数据规范化。

这使它成功了。