el-form 校验单个字段

2023-11-19

单个校验 核心为 validateField() 而非validate()

    <el-form
      :inline="false"
      :rules="rules"
      :model="formInline"
      ref="formInline"
      class="demo-form-inline"
      label-width="185px"
    >
      <el-form-item label="协管协议:" prop="escrowFiles" inline-message="true">
        // 此处↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        <FileUploadIndexS :types="['pdf']" @escrowFilesEmit="(val) => {escrowFilesEmit(val,'escrowFiles')}" />
      </el-form-item>
      <el-form-item  label="协管协议照片:" prop="escrowImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
      <el-form-item label="资产移交手续:" prop="assetFiles">
        <FileUploadIndexS :types="['pdf']" @assetImgsEmit="assetImgsEmit"  />
      </el-form-item>
      <el-form-item label="资产移交手续照片:" prop="assetImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
    </el-form>

    /* 协议文件 */
    escrowFilesEmit({ url,name },prop){
    this.formInline.escrowFiles = [...this.formInline.escrowFiles,{filesUr:url,filesName:name}]
    this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

 完整代码

父组件 

<!--
 * @Author       : qixiao
 * @Date         : 2023-06-28 22:03:07
 * @LastEditors  : qixiao
 * @LastEditTime : 2023-07-03 12:07:51
 * @FilePath     : \第三方\Sanfang-project\src\views\thirdunit\project\protect.vue
 * @Description  : 
 * 
-->
<template>
  <div class="pages">
    <!-- 1.项目详情 -->
    <p class="detail_tit">项目详情</p>
    <!-- 1.1 详细描述 -->
    <el-descriptions
      title=""
      :column="4"
      border
      class="margin-top centers"
      direction="vertical"
    >
      <el-descriptions-item label="管护主体">{{
        detailList.supervisorName
      }}</el-descriptions-item>
      <el-descriptions-item label="负责人">{{
        detailList.contacts
      }}</el-descriptions-item>
      <el-descriptions-item label="项目地址">{{
        detailList.county + detailList.town + detailList.village
      }}</el-descriptions-item>
      <el-descriptions-item label="联系电话">{{
        detailList.contactsPhone
      }}</el-descriptions-item>
    </el-descriptions>
    <!-- 2.合同及供应商信息 -->
    <p class="detail_tit bottoms">合同及供应商信息</p>
    <el-form
      :inline="false"
      :rules="rules"
      :model="formInline"
      ref="formInline"
      class="demo-form-inline"
      label-width="185px"
    >
      <el-form-item label="协管协议:" prop="escrowFiles" inline-message="true">
        <FileUploadIndexS :types="['pdf']" @escrowFilesEmit="(val) => {escrowFilesEmit(val,'escrowFiles')}" />
      </el-form-item>
      <el-form-item  label="协管协议照片:" prop="escrowImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
      <el-form-item label="资产移交手续:" prop="assetFiles">
        <FileUploadIndexS :types="['pdf']" @assetImgsEmit="assetImgsEmit"  />
      </el-form-item>
      <el-form-item label="资产移交手续照片:" prop="assetImgs">
        <FileUploadIndexS :types="['png', 'jpg', 'jpeg']" />
      </el-form-item>
    </el-form>
    <!-- 3.保存 -->
    <div class="fotter">
      <el-button type="primary" @click="Ctrl_S('formInline')">保 存</el-button>
      <el-button type="info">取 消</el-button>
    </div>
  </div>
</template>

<script>
import FileUploadIndexS from "@/views/components/construction/FileUploadIndexS.vue";
export default {
  components: { FileUploadIndexS },
  props: [],
  data() {
    /* 托管协议文件 */
    var escrowFilesRules = (rule, value, callback, source) => {
      if (this.formInline.escrowFiles.length == 0) {
        callback(new Error("托管协议文件不能为空"));
      } else {
        callback();
      }
    };
    /* 协管协议照片 */
    var escrowImgsRules = (rule, value, callback, source) => {
      if (this.formInline.escrowImgs.length == 0) {
        callback(new Error("协管协议照片为空"));
      } else {
        callback();
      }
    };
    /* 资产移交手续 */
    var assetFilesRules = (rule, value, callback, source) => {
      if (this.formInline.assetFiles.length == 0) {
        callback(new Error("资产移交手续不能为空"));
      } else {
        callback();
      }
    };
    /* 资产移交手续照片 */
    var assetImgsRules = (rule, value, callback, source) => {
      if (this.formInline.assetImgs.length == 0) {
        callback(new Error("资产移交手续照片不能为空"));
      } else {
        callback();
      }
    };
    return {
      /* 描述列表 */
      detailList: {},
      /* route传参 */
      routeDate: this.$route.query.id,
      /* form */
      formInline: {
        escrowFiles: [],
        escrowImgs: [],
        assetFiles: [],
        assetImgs: [],
      },
      rules: {
        escrowFiles: [
          {
            required: true,
            message: "协管协议不能为空",
            trigger: "change",
            validator: escrowFilesRules,
          },
        ],
        escrowImgs: [
          {
            required: true,
            message: "协管协议照片不能为空",
            trigger: "change",
            validator: escrowImgsRules,
          },
        ],
        assetFiles: [
          {
            required: true,
            message: "资产移交手续",
            trigger: "change",
            validator: assetFilesRules,
          },
        ],
        assetImgs: [
          {
            required: true,
            message: "资产移交手续照片",
            trigger: "change",
            validator: assetImgsRules,
          },
        ],
      },
    };
  },
  mounted() {},
  created() {},
  methods: {
    /* 保存 */
    Ctrl_S(formName){
        this.$refs[formName].validate((valid) => {
          if (valid) {
            alert('submit!');
          } else {
            console.log('error submit!!');
            return false;
          }
        });
    },

    /* 协议文件 */
    escrowFilesEmit({ url,name },prop){
    this.formInline.escrowFiles = [...this.formInline.escrowFiles,{filesUr:url,filesName:name}]
    this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

    /* 手续文件 */
    assetImgsEmit({url,name},prop){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validateField(prop,val => !val ? true : false);
    },

    /* 手续文件 */
    assetImgsEmit({url,name}){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validate();
    },
    /* 手续文件 */
    assetImgsEmit({url,name}){
        this.formInline.assetFiles = [...this.formInline.assetFiles,{filesUr:url,filesName:name}]
        this.$refs.formInline.validate();
    },
  },
};
</script>

<style lang='scss' scoped>
.pages {
  ::v-deep
    .centers
    .el-descriptions__body
    .el-descriptions__table
    .el-descriptions-item__label {
    text-align: center !important;
  }
  ::v-deep
    .centers
    .el-descriptions__body
    .el-descriptions__table
    .el-descriptions-item__content {
    text-align: center !important;
  }
  .bottoms {
    margin-top: 20px;
  }
  .fotter {
    margin-top: 20px;
    width: 100%;
    height: 40px;
    text-align: center;
  }
  ::v-deep .el-form-item__error{
    /* form校验样式 */
    // left:185px;
  }
}
</style>

 

子组件(文件、图片上传组件)
src\views\components\construction\FileUploadIndexS.vue

<!--
 * @Author       : qixiao
 * @Date         : 2023-06-29 09:50:43
 * @LastEditors: liushumin
 * @LastEditTime: 2023-06-29 22:17:04
 * @FilePath     : \第三方\Sanfang-project\src\views\components\construction\FileUploadIndexS.vue
 * @Description  : 
 * 
-->
<template>
  <div class="upload-file">
    <el-upload
      :action="uploadFileUrl"
      :limit="limit"
      :list-type="types.includes('pdf') ? 'none' : 'picture-card'"
      :on-preview="handlePictureCardPreview"
      :on-remove="handleRemove"
      :file-list="fileList"
      :http-request="myUpload"
      :before-upload="handleBeforeUpload"
    >
      <i v-if="!types.includes('pdf') ? (!text ? true :false) : false" class="el-icon-plus"></i>
      <el-button
        v-if="
          types.includes('pdf')
            ? limit == fileList.length
              ? false
              : true
            : false
        "
        >点击上传</el-button
      >
      <span v-if="text ? (limit == fileList.length ? false : true) : false"
        >上传</span
      >
    </el-upload>
    <el-dialog
      title="图片预览"
      :append-to-body="true"
      :visible.sync="dialogVisible"
    >
      <img
        style="max-height: 70vh; max-width: 100%"
        :src="dialogImageUrl"
        alt=""
      />
    </el-dialog>
  </div>
</template>

<script>
export default {
  components: {},
  props: ["limit", "types", "text"],
  data() {
    return {
      dialogImageUrl: "", //预览
      dialogVisible: false, //预览
      uploadFileUrl: process.env.VUE_APP_BASE_API + "/nt/common/file/upload", // 上传文件服务器地址
      fileList: [],

      // ["png", "jpg", "jpeg","pdf"]
      fileType: this.types, //文件格式
      fileSize: 60, //文件大小
    };
  },
  watch:{
    "fileList"(J,K){
      if(J.length == this.limit) {
        let dom = document.querySelector(".el-upload");
        dom.style.setProperty("display","block")
      }
    }
  },
  mounted() {},
  created() {},
  methods: {
    handleRemove(file, fileList) {
      console.log(file);
      console.log(fileList);
      let arr = [];
      this.fileList = [];
      fileList.map((item) => arr.push(item.url));
      fileList.map((item) => this.fileList.push({ url: item.url }));
      console.log(arr);
      this.$emit("remove", arr);
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url;
      if (!file.url.includes(".pdf")) {
        this.dialogVisible = true;
      } else {
        window.open(file.url);
      }
    },
    myUpload(content) {
      console.log(content);
      let param = new FormData(); // 创建form对象
      param.append("uploadfile", content.file, content.file.name);
      param.append("source", "gb"); // 高标
      const loading = this.$loading({
        lock: true,
        text: "上传中,请稍等",
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)",
      });
      console.log(param);
      this.axios({
        url: content.action,
        method: "post",
        headers: {
          Authorization: window.localStorage.getItem("TokenKey") || "",
        },
        data: param,
      }).then((response) => {
        if (response.data.code == 200) {
          console.log(response.data.data);
          loading.close();
          content.onSuccess(response.data.data);
          this.$nextTick(() => {
            this.fileList.push({
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
          });
          console.log(response.data.data.result.url);
          console.log(this.limit, this.fileList.length);
          if (response.data.data.result.url.includes(".pdf")) {
            this.$emit("pdfEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
            /* 协管协议: */
            this.$emit("escrowFilesEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
            /* 资产移交手续: */
            this.$emit("assetImgsEmit", {
              url: response.data.data.result.url,
              name: response.data.data.result.originalFilename,
            });
          } else {
            this.$emit("imgUrl", response.data.data.result.url);
            /* 协管协议照片 */
            this.$emit("escrowImgsEmit", response.data.data.result.url);
            /* 资产移交手续照片 */
            this.$emit("assetImgsEmit", response.data.data.result.url);
          }
        }
        console.log(this.fileList);
      });
    },
    // 上传前校检格式和大小
    handleBeforeUpload(multipartFile) {
      // 校检文件类型
      if (this.fileType) {
        const fileName = multipartFile.name.split(".");
        const fileExt = fileName[fileName.length - 1];
        const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
        if (!isTypeOk) {
          this.$modal.msgError(
            `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
          );
          return false;
        }
      }
      // 校检文件大小
      if (this.fileSize) {
        const isLt = multipartFile.size / 1024 / 1024 < this.fileSize;
        if (!isLt) {
          this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
          return false;
        }
      }
      this.$modal.loading("正在上传文件,请稍候...");
      this.number++;
      return true;
    },
  },
};
</script>

<style lang="scss" scoped>
::v-deep .el-dialog__body {
  padding: 20px 20px 30px 20px !important;
  text-align: center;
}

::v-deep .el-upload-list__item.is-success:focus:not(:hover) {
  display: none !important;
}
</style>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

el-form 校验单个字段 的相关文章

随机推荐

  • 什么是模式、什么是模式识别、模式识别的方法、过程

    什么是模式 pattern 模式是存在于时间和空间中可观察的物体 如果可以区分相同或者相似的物体类别 可区分的物体称之为模式 模式不是指具体的物体 而是抽象的类别 例如 人这个类别是一种模式 自行车这个类别是一种模式 什么是模式识别 1 模
  • 用Python爬取英雄联盟(lol)全部皮肤

    小三 怎么了小二 一副无精打采的样子 小二 唉 别提了 还不是最近又接触了一个叫英雄联盟的游戏 游戏中很多皮肤都需要花钱买 但是我钱不够呀 小三 咋得 钱攒够了你还要买呀 还吃不吃饭了 要我说 你干脆将英雄的炫彩皮肤都爬下来欣赏一下得了 饭
  • 预警:传统的QA岗位将被DevOps淘汰

    导读 在大多数机构或公司里 软件开发过程主要遵循一个或多个开发模型 例如瀑布模型或敏捷模型 在瀑布模型中 测试活动一般都在后期进行 软件开发完成后 缺陷被QA团队找出 然后再被修复 后两个活动不断循环和重复 指导管理者认为软件可以被公开发布
  • 在wsl中判断wsl的版本是wsl1还是wsl2

    判断wsl的版本 代码逻辑 通过判断 cat proc version 是否包含wsl等字符来判断wsl的版本 代码 bin bash Get the content of proc version proc version cat pro
  • chatgpt赋能python:如何用Python进行SEO优化

    如何用Python进行SEO优化 介绍 Search Engine Optimization SEO 即搜索引擎优化 是提高网站排名和流量的关键 Python作为一种强大的编程语言 可以帮助我们优化网站的SEO 在本文中 我们将探讨如何用P
  • 如何批量Ping 1000个IP地址,一个小技巧节约N小时?

    一 批量ping网段 对于一个网段ip地址众多 如果单个检测实在麻烦 那么我们可以直接批量ping网段检测 那个ip地址出了问题 一目了然 先看代码 直接在命令行窗口输入 for L D in 1 1 255 do ping 10 168
  • 定义类数组

    编写学生类 包含姓名 学号 成绩三个属性 题目要求 1 为学生类添加构造函数给每个成员属性赋值 使用this关键字 2 为学生添加toString 方法显示所有属性 3 在测试类中定义学生数组 长度为4 分别给数组每个元素赋值 然后循环调用
  • Vue自定义插件的编写

    如何实现一个vue的自定义插件 div div
  • windows 如何查询主板sn(主板ID)

    wmic bios get serialnumber
  • dell服务器维护软件,Dell服务器硬件,RAID等查询和维护软件OMSA_推荐

    Dell服务器硬件 RAID等查询和维护软件OMSA 推荐 原创 chenshengang2014 01 17 19 07 03 著作权 阅读数 441 著作权归作者所有 来自51CTO博客作者chenshengang的原创作品 如需转载
  • Java 读取resources下的资源文件

    Web项目中应该经常有这样的需求 在maven项目的resources目录下放一些文件 比如一些配置文件 资源文件等 文件的读取方式有好几种方式 本文会对常用的读取方式做一个总结 并说明一下应该注意的地方 准备工作 新建一个spring t
  • 无向图染色问题-dfs剪枝

    无向图染色问题 问题描述 给定一个无向图 要求用最少的颜色将节点染色 限制是不能让相邻节点染上相同的颜色 算法 使用dfs 为节点分配不同的颜色进行尝试 计算每种分配所需的颜色数 最终进行回溯 取得最小的颜色数 代码 C include
  • OpenAI最新发布通用人工智能路线图!AGI比想象中来得更快!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 转载自 机器之心 编辑 泽南 小舟 通用人工智能的出现可能只是技术发展历程中的一个小节点 因为 AGI 或许可以加速自身的进
  • 点云/网格模型的体积计算

    点云体积计算 有时用激光扫描设备扫描零件或者用无人机进行测量后会想知道它们的体积 比如下面的土堆 如果扫描得到的数据是一系列三维点云 那么体积就比较难求 因为如何定义物体的边界比较困难 一种方法是提取三维点云的凸壳 包络体 然后再进行计算
  • 第五章 数据清洗

    5 1数据去重 5 1 1完全去重 点击 获取字段 配置csv文件输入的属性 Name Gender City 配置唯一行属性 选择要去重的属性 Name Gender City 运行结果 完全去重成功 5 1 2不完全去重 将文本分隔符替
  • 支付宝短视频平台创作分成激励项目

    没想到支付宝也开通了中视频计划 这波羊毛算是蒿定了 最近啊 马爸爸火速上线了支付宝创作分成计划 明显就是抄的抖音中视频计划 目前还在内测阶段 补贴的力度非常大 错过的话就只能拍大腿了 看到短视频这么的火爆 巨头大佬们都想分一杯羹啊 阿里也不
  • Linux下MySQL启动、停止、重启的几种方式

    一 启动 1 使用service 启动 service mysqld start 2 使用 mysqld 脚本启动 etc inint d mysqld start 3 使用 safe mysqld 启动 safe mysqld 二 停止
  • 互联网产品上线流程,及面试题分类

    一 基础情况 问题1 自我介绍 3mins 与自我介绍 1min 问题2 为什么你要来这个行业 问题3 为什么你要来这个岗位 问题4 为什么你能胜任这份工作 问题5 为什么你要离职 问题6 过往经历STAR故事描述 问题7 你的职业规划是什
  • php mes代码,完整MES代码(含客户端和server端)

    实例简介 完整的代码 带数据库文件 包含客户端 服务端 实例截图 核心代码 MES 源代码 MES 源代码 MES 源代码 dll AjaxControlToolkit dll AspNetServer dll AxInterop CELL
  • el-form 校验单个字段

    单个校验 核心为 validateField 而非validate