解决antd upload自定义上传customRequest,上传时一直loading加载的问题

问题:antd自定义上传customRequest时,无法正常显示上传成功状态,一直在上传的loading状态中。
在这里插入图片描述

查看customRequest参数

在这里插入图片描述
解决方法:调用onSuccess事件,解决loading一直加载的问题。

<template>
    <a-upload
        ref="filesUpload"
        :class="['isbm-files-upload', { 'hidden-upload-button': !showUploadButton }]"
        v-model:file-list="innerFileList"
        :action="action"
        :data="data"
        :accept="accept"
        :disabled="disabled"
        :multiple="multiple"
        :maxCount="maxCount"
        :show-upload-list="{ showPreviewIcon: true, showDownloadIcon: true, showRemoveIcon: true }"
        :beforeUpload="beforeUpload"
        :customRequest="customRequest"
        @preview="handlePreview"
        @change="handleChange"
        @download="handleDownload"
        @remove="handleRemove"
    >
        <div>
            <a-button :type="buttonType" :disabled="disabled">
                <template #icon><upload-outlined></upload-outlined></template>
                上传附件
            </a-button>
        </div>

        <template #downloadIcon>下载</template>
        <template #removeIcon>删除</template>
    </a-upload>
</template>

<script setup>
import { ref, computed, getCurrentInstance } from 'vue';
import { UploadOutlined } from '@ant-design/icons-vue';
import fileRequest from '@/config/fileRequest.js';
import { getFileType, downloadNormal } from '@/utils';

const props = defineProps({
    action: {
        // 自定义上传的地址
        type: String,
        default: '/system/file/upload' // 默认上传地址
    },
    data: {
        type: Object,
        default() {
            return {
                bizType: ''
            };
        }
    },
    fileList: {
        type: Array,
        default() {
            return [];
        }
    },
    disabled: {
        // 是否禁用
        type: Boolean,
        default: false
    },
    showUploadButton: {
        // 是否显示上传按钮
        type: Boolean,
        default: true
    },
    multiple: {
        // 是否支持多选文件
        type: Boolean,
        default: false
    },
    maxCount: {
        // 限制上传数量
        type: Number,
        default: undefined
    },
    maxSize: {
        type: Number,
        default: 200 //单位:M
    },
    accept: {
        // 接受上传的文件类型
        type: String,
        default:
            '.bmp, .jpg, .jpeg, .png, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .txt, .rar, .zip, .3gpp, .mp4, .mpeg, .mov, .m4v, .mng, .avi, .mid, .midi, .mp3, .m4a, .dwg, .pdf, .mpp, .wav, .wps'
    },
    uploadNotice: {
        // 下标提示
        type: String,
        default:
            '支持扩展名:.bmp, .jpg, .jpeg, .png, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .txt, .rar, .zip, .3gpp, .mp4, .mpeg, .mov, .m4v, .mng, .avi, .mid, .midi, .mp3, .m4a, .dwg, .pdf, .mpp, .wav, .wps'
    },
    customActionConfig: {
        // 使用自定义上传的相关配置,目前主要是请求参数,后期可以拓展,在watch中初始化参数
        type: Object,
        // default(rawProps) {
        //     return { message: 'hello' }
        // }
        default() {
            return {};
        }
    },
    visible: {
        type: Boolean,
        default: false
    },
    buttonType: {
        type: String,
        default: 'primary'
    }
});
const emit = defineEmits(['update:fileList', 'onExceed', 'remove']);

const { proxy } = getCurrentInstance();

const filesUpload = ref(null);
const innerFileList = computed({
    get() {
        return props.fileList;
    },
    set(value) {
        emit('update:fileList', value);
    }
});

// 上传文件之前的钩子
const beforeUpload = (file, fileList) => {
    // fileList 只包含了当次上传的文件列表,不包含已上传的文件列表
    if (props.maxCount && innerFileList.value.length + fileList.length > props.maxCount) {
        console.log(innerFileList.value.length);
        proxy.$message.error(`上传文件数量超出最大限制${props.maxCount}`);
        emit('onExceed', file);
        return false;
    }

    if (file.size / 1024 / 1024 > props.maxSize) {
        proxy.$message.error(`上传文件超出最大限制${props.maxSize}M`);
        emit('onExceed', file);
        return false;
    }

    const suffix = getFileType(file.name); // 获取文件后缀名
    if (props.accept.indexOf(suffix) === -1 && props.accept.indexOf('image') === -1) {
        proxy.$message.error('文件格式错误');
        return false;
    }
    // return false 时status为undefined

    return true;
};
// 自定义上传
const customRequest = (event) => {
    const formData = new FormData();
    if (event.data) {
        Object.keys(event.data).forEach((key) => {
            formData.append(key, event.data[key]);
        });
    }
    formData.append(event.filename, event.file);
    fileRequest
        .post(event.action, formData, { withCredentials: event.withCredentials })
        .then((res) => {
            event.onSuccess(res, event.file); //上传成功监听事件
        })
        .catch((err) => {
            event.onError(err, err, event.file); //上传失败监听事件,onError 第二个参数要是字符串才能显示错误原因
            proxy.$message.error(event.file.name + err);
        });
};
const handleChange = (event) => {
    const fileList = event.fileList;
    // const file = event.file;
    // const status = file.status;  // 状态有:uploading done error removed; 另外beforeUpload钩子函数中return false 时,status为undefined
    // if (status === 'uploading') {
    //     loading.value = true;
    // } else if (status === 'done') {
    //     loading.value = false;
    // } else if (status === 'error') {
    //     loading.value = false;
    // } else if (status === 'removed') {
    //     console.log('removed');
    // } else if (status === undefined) {
    //     console.log('reject');
    // }
    innerFileList.value = fileList.filter((file) => ['uploading', 'done'].includes(file.status));
};
const handleDownload = (file) => {
    downloadNormal(file.response.pk, file.response.name);
};
const handlePreview = (file) => {
    window.open(file.response.url);
};
const handleRemove = (file) => {
    emit('remove', file);
    return true;
};
</script>

<style lang="less" scoped>
.isbm-files-upload {
    &.hidden-upload-button {
        :deep(.ant-upload.ant-upload-select) {
            display: none;
        }
    }

    .file-question-circle {
        margin-left: 6px;
        color: var(--isbm-disabled-color);
    }
    :deep(span.ant-upload-list-item-name) {
        color: #1890ff;
        background-color: transparent;
        cursor: pointer;
    }
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

cmake和vscode 下的cmake的使用详解(一)。

本文的内容 参考如下内容。 1.【基于VSCode和CMake实现C/C开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source0ddb24a02523448baa69b0b871ab50f7 2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 3.关于如何利用…

11.30_黑马Redis实战篇分布式锁

实战篇9 设立一个在jvm外的锁监视器&#xff0c;可以处理多线程的问题 实战篇10 获取锁的时候&#xff0c;要同时发生获取锁以及设置到期时间。 实战篇11 thinking&#xff1a;JAVA中的自动拆箱与装箱&#xff1f; 【Java基础】自动拆装箱_Elephant_King的博客-CSDN博客 TR…

SQL Sever 基础知识 - 数据筛选

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

笔记64:Bahdanau 注意力

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a

C语言--有三个字符串,要求找出其中长度最大的那一个

一.题目描述 有三个字符串&#xff0c;要求找出其中长度最大的那一个。 比如&#xff1a;输入三个字符串是&#xff1a; 第一个字符串:hello 第二个字符串&#xff1a;worldasd 第三个字符串&#xff1a;abcd 输出&#xff1a;最长的字符串是&#xff1a;worldasd 二.思路分析…

井盖位移报警器安装,智能化井盖厂家推荐

当井盖发生位移或倾斜时&#xff0c;通常会引起所处道路的安全隐患&#xff0c;给过往的车辆和行人带来许多潜在的危险。为了避免潜在的安全事故频繁出现&#xff0c;及时发现并处理井盖位移或倾斜才能更好的保障人民的安全。因此安装井盖位移报警器是满足政府和市民需求的。 单…

边缘计算网关:智能制造的“智慧大脑”

一、智能制造的崛起 随着科技的飞速发展&#xff0c;智能制造已经成为了制造业的新趋势。智能制造不仅能够提高生产效率&#xff0c;降低生产成本&#xff0c;还能够实现个性化定制&#xff0c;满足消费者多样化的需求。然而&#xff0c;智能制造的实现离不开大量的数据处理和分…

智能优化算法应用:基于鸽群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸽群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸽群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸽群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

ARM与大模型,狭路相逢

编辑&#xff1a;阿冒 设计&#xff1a;沐由 从去年底至今&#xff0c;伴随着OpenAI旗下ChatGPT的火爆&#xff0c;一波AI大模型推动着AI应用全面进入了大模型时代。与此同时&#xff0c;随着边缘算力的提升&#xff0c;AI大模型的部署也逐渐从云端涉入到边缘。 世界对AI算力的…

cpu飙高问题,案例分析(三)——非标导入引发CPU彪高,与RateLimiter限流

一、背景 非标导入使用easyexcel组件进行导入处理&#xff0c;10几万的数据量引发CPU彪高。 二、排查思路 查看线程栈相关信息&#xff1b;pinpoint监控查看性能及代码调用情况&#xff1b;是否存在大量阻塞慢SQL&#xff1b;是否存在短时间内频繁日志输出&#xff1b; 三、…

element中el-form-item设置label-width=‘auto‘报错

文章目录 一、问题二、解决三、最后 一、问题 el-form中的设置了全局标题宽度是200px&#xff0c;此时想要对el-form-item取消标题宽度&#xff0c;设置了label-widthauto&#xff0c;结果&#xff0c;报错了~~~ <el-form label-width"200px" label-position&quo…

echarts 地图

效果图 业务组件 <template><mapEcharts :itemStyle"mapProps.itemStyle" :emphasisLabelStyle"mapProps.emphasisLabelStyle":emphasisItemStyle"mapProps.emphasisItemStyle" :labelInfo"mapProps.labelInfo":rippleEffec…

类和对象——(3)再识对象

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 你说那里有你的梦想&#xff0c;…

Git常用命令#merge分支合并

要查看所有分支&#xff0c;包括本地和远程仓库的分支&#xff0c;可以使用以下命令&#xff1a; 1.查看分支 1.1 查看本地分支 git branch这个命令会列出本地所有的分支&#xff0c;当前所在的分支会有 * 标记。 1.2 查看远程分支 git branch -r这个命令会列出远程仓库的分…

RAM++(recognize anything++)—— 论文详解

一、概述 1、是什么 RAM&#xff08;RAM plus plus&#xff09;论文全称 《Open-Set Image Tagging with Multi-Grained Text Supervision》。区别于图像领域常见的分类、检测、分割&#xff0c;他是标记任务——多标签分类任务&#xff08;一张图片命中一个类别&#xff09;&…

hutool的bug之 DateUtil.endOfDay(DateUtil.date())

hutool 工具类DateUtil 使用时谨慎 DateUtil.endOfDay 得到的时间保存到数据时会增加一秒 首先比较下时间的long值&#xff1a; 这样就很明显的看出来&#xff0c;hutool工具类的date是毫秒位多了.999,保存到mysql 的时候&#xff0c;MySQL数据库对于毫秒大于500的数据进行…

基于B/S架构的医院一体化电子病历编辑器源码

电子病历在线制作、管理和使用的一体化电子病历解决方案&#xff0c;通过一体化的设计&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心&#xff0c;以临床诊疗信息为主线…

基于51单片机的电子时钟设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的数字时钟&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 它可以对年、月、日、时、分、秒进行计时&#xff0c;而且DS1302的使用寿命长&#xff0c;误差小。对于数字电子…

qt-C++笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString

qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString code review! 文章目录 qt-C笔记之点击按钮弹出文件资源管理器选择文件后把文件路径赋值给一个QString1.运行2.main.cpp3.qt_FileDialog.pro4.QFileDialog类详解 1.运行 2.main.cpp 代码 #inclu…

loading...字符变化动画

公司业务一个简单的需求loading...文字动画&#xff0c;不想用js实现&#xff0c;问过GPT后学习了css写法 效果预览 代码实现 keyframes text-change {0% { content: "."; }33% { content: ".."; }66% { content: "..."; }}.text_loading_anima…