TypeScript - отправлять необязательное поле на POST, только если есть значение - PullRequest
0 голосов
/ 20 июня 2019

Я использую Formik в своем приложении React.У меня есть простая форма с 3 полями.Я делаю 2 операции с этой формой.Добавить / изменить ресурсы.

Моя проблема в том, что одно поле является необязательным.То есть я никогда не должен отправлять его, если его значение равно нулю В настоящее время я отправляю пустую строку, которая является неправильной.

Я использую TS-React-Formik, и вот мой код для метода handleSubmit:

interface IValues extends FormikValues {
  name: string;
  owner?: string;
  groups: string[];
}

interface CreateAndEditProps {
  doSubmit(service: object, values: object): AxiosResponse<string>;
  onSave(values: IValues): void;
}

handleSubmit = (values: FormikValues, formikActions:FormikActions<IValues>) => {
    const { doSubmit, onSave, isEditMode } = this.props;
    const { setSubmitting } = formikActions;
    const payload: IValues = {
      name: values.name,
      groups: values.groups,
      owner: values.owner
    };
    const submitAction = isEditMode ? update : create;
    return doSubmit(submitAction, payload)
      .then(() => {
        setSubmitting(false);
        onSave(payload);
      })
      .catch(() => {
        setSubmitting(false);
      });
  };

Я думал, что простое утверждение if сработает, и хотя оно работает, мне оно совсем не нравится.Позвольте мне привести пример того, почему.Если я добавлю еще 2 необязательных поля, как я собираюсь сделать, в аналогичной форме, я не хочу делать несколько операторов if для достижения этой цели.

Если бы вы могли придумать более элегантный и СУХОЙ способделать это, это было бы удивительно.Спасибо за ваше время.

1 Ответ

1 голос
/ 20 июня 2019

Посмотрите на removeEmptyKeys () ниже.Он принимает объект и удаляет ключи с пустой строкой. Он мутирует исходный объект, пожалуйста, измените его соответствующим образом, если вы ожидаете поведение diff.

В вашем коде после определения полезной нагрузки я бы просто вызвал этот метод, removeEmptyKeys (полезная нагрузка)

Также это решит вашу проблему, если еще.

removeEmptyKeys = (item)=>{
Object.keys(item).map((key)=>{
if(payload[key]===""){
delete payload[key]}
})}

var payload = {
one : "one",
two : "",
three : "three"
}
removeEmptyKeys(payload)

Пожалуйста, отметьте это как решенное, если вы найдете это полезным.

Для вашего кода:

const removeEmptyKeys = (values: IValues): any => {
Object.keys(values).map((key) => { 
if (payload && payload[key] === "")
{ delete payload[key] } }) 
return values; 
}
...