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

和其他数据规范化。

这让它起作用了。