【问题标题】:TypeScript - Send optional field on POST only when there is valueTypeScript - 仅在有值时在 POST 上发送可选字段
【发布时间】:2019-06-20 06:01:50
【问题描述】:

我在我的 React 应用程序中使用 Formik。我有一个包含 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 语句来实现这一点。

如果你能想到一种更优雅、更干的方法,那就太棒了。感谢您的宝贵时间。

【问题讨论】:

    标签: javascript reactjs typescript formik http-method


    【解决方案1】:

    看看下面的 removeEmptyKeys()。 它接受一个对象并删除具有空字符串的键。它会改变原始对象,如果您期望差异行为,请相应地更改它。

    在定义有效负载后的代码中,我会简单地调用这个方法,removeEmptyKeys(payload)

    它还可以解决您的 if else 问题。

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

    【讨论】:

    • 感谢您的回答。一条评论。这是代码,我曾经让它工作。请在您的描述中添加它。我会将其标记为正确。 const removeEmptyKeys = (values: IValues): any =&gt; { debugger; Object.keys(values).map((key) =&gt; { if (payload &amp;&amp; payload[key] === "") { delete payload[key] } }) return values; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2023-04-04
    • 2016-12-09
    相关资源
    最近更新 更多