场景

我们提交表单,但是后端未通过并且返回报错信息,我们如何将下面的信息显示在表单上呢?

{
  "error": {
    "email": ["邮箱已经存在"],
    "password": ["密码过于简单"]
  }
}

解决方法

我们需要使用到 Form.Item 中的 helpvalidateStatus 俩接口来实现信息显示

help 提示信息

validateStatus 校验状态

我们来写个 hook

//  useFormFeedback.ts

/**
 * 处理 form 提交到后端后,后端返回的错误信息显示在 formItem 上
 * @example
 * <AFormItem name="email" v-bind="getFeedbackBind('email')" />
 *
 * scripts
 * const { setFeedback, getFeedbackBind, resetFeedback} = useFormFeedback()
 *
 * 请求 api 报错后
 * setFeedback(res.errors)
 */
import { ref, unref } from "vue";

type ReturnType = {
  setFeedback(feedbacks: Record<string, string[]>): void;
  getFeedbackBind(fieldName: string): Object;
  resetFeedback(): void;
};
export function useFormFeedback(): ReturnType {
  const feedbacks = ref({});

  function setFeedback(feedbacksData: Record<string, string[]>) {
    feedbacks.value = feedbacksData;
  }

  function getFeedbackBind(fieldName: string) {
    const fieldFeedback = unref(feedbacks)[fieldName];
    if (fieldFeedback && fieldFeedback.length > 0) {
      return {
        help: fieldFeedback[0],
        "validate-status": "error",
      };
    }

    return {};
  }

  function resetFeedback() {
    feedbacks.value = [];
  }

  return {
    setFeedback,
    getFeedbackBind,
    resetFeedback,
  };
}

使用

我们来看下如何使用

<AForm ref="formRef" :model="formState">
<AFormItem
    name="email"
    :rules="[{ required: true, message: '请输入邮箱' }]"
    v-bind="getFeedbackBind('email')"
>
    <AInput
        v-model:value="formState.email"
    />
</AFormItem>
</AForm>

<script lang="ts" setup>
const { setFeedback, getFeedbackBind, resetFeedback } = useFormFeedback();

ApiRequest()
  .then(() => {
    //  清空 feedback 信息
    resetFeedback()
  })
  .catch((err) => {
    //  设置 error 信息
    setFeedback(err.data.errors);
  });
</script>