一、问题描述

1、上传时,组件是否自动上传可以设置如下属性

// auto-upload 是否选取文件后立即进行上传

// 选取文件后 不自动上传
:auto-upload="false"

2、当 :autoupload=”false“,组件

 设置完以后,发现before-upload这个钩子触发了;

原来的逻辑
before-upload这个钩子内部上传的文件进行限制

before-upload   上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。

二、解决办法

利用on-change这个钩子

 :on-change="handleChange"

on-change属性介绍

on-change
文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用

注意加上一个判断

if (file.status !== "ready") return;

上传文件限制代码如下: 

           handleChange(file)  {
                if (file.status !== "ready") return;
                let suffName = file.name.substring(file.name.lastIndexOf('.') + 1)
                const extension = suffName === 'xml'
                const isLt10M = file.size / 1024 / 1024 < 10
                if (!extension) {
                    this.$message({
                        message: '上传文件只能是xml格式!',
                        type: 'warning'
                    })
                    this.fileList = []
                    return false;
                }
                if (!isLt10M) {
                    this.$message({
                        message: '上传文件大小不能超过 10MB!',
                        type: 'warning'
                    })
                    return false;
                }
                this.fileList = fileList.slice(-1);
                const formData = new FormData();
                formData.append("file", file.raw);
                // 在此处编写对接api代码
            },

三、考虑用户体验,新增文件必填,并且  当文件上传以后去掉必填校验提示,譬如这个

1、首先定义校验提示

export default {
 data() {
       let validateFile = (rule, value, callback) =&gt; {
      if (this.fileList.length == 0) {
        callback(new Error("请上传文件"));
      } else {
        // 清空校验提示
        this.$refs["dataForm"].clearValidate(["fileList"]);
        callback();
      }
    };
  return {
    rules: [{
      fileList: [{ required: true, validator: validateFile, trigger: "blur" }],
    }]
   }
 }
}

2、在watch监听状态

 watch: {
    fileList: {
      handler(newVal) {
        if (newVal.length) {
          this.$refs["dataForm"].clearValidate(["fileList"]);
        }
      },
      deep: true
    }
  }

3、完整代码如下:

<template&gt;
  <div&gt;
    <el-form
          ref="dataForm"
          :inline="true"
          :rules="rules"
          :model="temp"
          label-position="right"
          label-width="130px"
          style="margin: 0 40px"
        &gt;
        <el-form-item label="hbase.site.xml" prop="fileList"&gt;
                <el-upload
                  ref="upload"
                  class="upload-demo"
                  action
                  :file-list="fileList"
                  :before-upload="beforeAvatarUpload"
                  :on-remove="handleRemove"
                  :on-change="fileChangeOne"
                  accept
                  :auto-upload="false"
                &gt;
                  <el-button slot="trigger" size="small"&gt;选择文件</el-button>
                </el-upload>
              </el-form-item>
   </el-form>
 </div>
</template>
export default {
 data() {
       let validateFile = (rule, value, callback) => {
      if (this.fileList.length == 0) {
        callback(new Error("请上传文件"));
      } else {
        // 清空校验提示
        this.$refs["dataForm"].clearValidate(["fileList"]);
        callback();
      }
    };
  return {
    rules: [{
      fileList: [{ required: true, validator: validateFile, trigger: "blur" }],
    }]
   }
 },
 watch: {
    fileList: {
      handler(newVal) {
        console.log(newVal.length, "newVal.length");
        if (newVal.length) {
          this.$refs["dataForm"].clearValidate(["fileList"]);
        }
      },
      deep: true
    }
  },
 methods: {
     beforeAvatarUpload(file) {
      console.log(file, "file");
      const Xls = file.name.split(".");
      const fileType = ["xml"];
      if (fileType.includes(Xls[1])) {
        return file;
      }
      this.$message({
        type: "error",
        message: `文件类型不符合`,
        offset: 60
      });
      return false;
    },
   handleRemove() {
    this.fileList = []
  },
 async fileChangeOne(file) {
    if (file.status !== "ready") return;
    const fileType = file.name.substring(file.name.lastIndexOf('.') + 1)
    const extension = fileType === 'xml'
    if (!extension) {
        this.$message({
            message: '上传文件只能是xml格式!',
            type: 'warning'
        })
        this.fileList = []
        return false;
    }
    this.fileList = fileList.slice(-1);
    const formData = new FormData();
    formData.append("file", file.raw);
 }
}

原文地址:https://blog.csdn.net/vanora1111/article/details/131230730

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46940.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注