灏天阁

vue3.2/Vite/Ts44: 品牌管理模块表单校验

· Yin灏

目录结构

└─src
    └─views
        └─product
            └─trademark
                └─index.vue

dialog 表单校验处理

src/views/product/trademark/index.vue

<template>
  <!-- ... -->
  <!-- 对话框组件 -->
  <el-dialog v-model="dialogFormVisible" title="添加品牌">
    <el-form :model="trademarkParams" :rules="rules" ref="formRef">
      <el-form-item label="品牌名称" label-width="80px" prop="tmName">
        <el-input
          placehodler="请输入品牌名称"
          v-model="trademarkParams.tmName"
        ></el-input>
      </el-form-item>
      <el-form-item label="品牌LOGO" label-width="80px" prop="logoUrl">
        <el-upload
          action="/api/admin/product/fileUpload"
          :show-file-list="false"
          :before-upload="beforeAvatarUpload"
          :on-success="handleAvatarSuccess"
        >
          <img v-if="trademarkParams.logoUrl" :src="trademarkParams.logoUrl" />
          <el-icon v-else>
            <Plus />
          </el-icon>
        </el-upload>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button type="primary" size="default" @click="cancel">取消</el-button>
      <el-button type="primary" size="default" @click="confirm">确定</el-button>
    </template>
  </el-dialog>
</template>
<script setup lang="ts">
  import { reactive, nextTick } from "vue";
  import type { TradeMark } from "@/api/product/trademark/type";
  import {
    reqHasTrademark,
    reqAddOrUpdateTrademark,
  } from "@/api/product/trademark";

  let formRef = ref();

  let trademarkParams = reactive<TradeMark>({
    tmName: "",
    logoUrl: "",
  });

  //...
  const confirm = async () => {
    // 发请求之前要对所有的表单项进行校验
    await formRef.value.validate();
    //...
  };
  //...

  // 弹出添加品牌的弹窗
  const addTradeMark = () => {
    //...
    // 第一种方法
    // formRef.value?.clearValidate('tmName');
    // formRef.value?.clearValidate('logoUrl');
    // 第二种方法
    nextTick(() => {
      formRef.value.clearValidate("tmName");
      formRef.value.clearValidate("logoUrl");
    });
  };

  // 弹出修改品牌的弹窗
  const updateTradeMark = () => {
    nextTick(() => {
      formRef.value.clearValidate("tmName");
      formRef.value.clearValidate("logoUrl");
    });
  };

  // 图片上传成功
  let handleAvatarSuccess: UploadProps["onSuccess"] = (
    response,
    uploadFile
  ) => {
    //...
    // 上传成功后就清楚对应 logoUrl 的错误提示
    formRef.value.clearValidate("logoUrl");
  };

  const validatorTmName = (rule: any, value: any, callBack: any) => {
    if (value.trim().length >= 2) {
      callBack();
    } else {
      callBack(new Error("品牌名称位数要大于等于来归两位"));
    }
  };

  const validatorLogoUrl = (rule: any, value: any, callBack: any) => {
    // 此时会触发图片的校验
    /*
      comfirm 的时候,添加 formRef.value.validate() 这句,才会触发图片 upload 的校验
    */
    if (value) {
      // 图片上传
      callBack();
    } else {
      callBack(new Error("LOGO 图片务必上传"));
    }
  };

  // 表单检验规则
  const rules = {
    tmName: [
      {
        required: true,
        trigger: "blur",
        validator: validatorTmName,
      },
    ],
    logoUrl: [
      {
        required: true,
        trigger: "change",
        validator: validatorLogoUrl,
      },
    ],
  };
</script>

- Book Lists -