【Vue】Antd Pro Vue的使用(五)—— 多文件上传回显问题
CrazyPanda发表于:2024-05-06 15:56:34浏览:341次
需求:
多文件上传 ,上传的时候绑定fileList回显
vue版本:
vue2
问题:
上传成功了,也拿到了后台返回的数据,但是onchang监听的时候,file的状态一直是uploading
原因:onchange 只触发了一次
解决:
使用单文件上传时@change事件会至少触发两次,一次file.status=uploading,最后一次要么是done或者error,
handleUpload1(info) { if (info.file.status === 'uploading') { this.loading = this.isUpload1 = true return } if (info.file.status === 'done') { this.loading = this.isUpload1 = false this.params.imgUrl1 = info.file.response.data.url } }
但是如果是需要上传显示一组文件,则需要保存文件的状态会给一个属性 :file-list="fileList"
这时候change事件只会触发一次(uploading),后来在github上看到解决方法
对于受控模式,你应该在 onChange 中始终随时跟踪 fileList 的状态,保证所有状态同步到 Upload 内
handleUploadChange ({ file, fileList }) { if (file.status === 'uploading') { // return true } this.imgsList = fileList }
最后一行是关键,无论file上传状态如何,filelist一定要同步,还有不能用return,要不然就没有回调了
注意:如果上传添加了上传前size校验,校验不通过,返回false,上传不成功,但是change方法依然会被触发,如果直接使用this.imgsList = fileList,页面就会多显示一个图片,所以change里面也要添加校验,不能直接添加所有文件,以免页面显示错误。
完整代码:
<a-form-item label="项目图片"> <a-upload list-type="picture-card" class="avatar-uploader" action="/common/common/upload_file" :file-list="imgsList" :before-upload="beforeUpload" :accept="'image/*'" :remove="handleUploadRemove" v-decorator="['imgs', {initialValue:model?.imgs_arr || [], rules: [{required: true, message: '请上传项目图片'}]}]" placeholder="请上传项目图片" @change="handleUploadChange" > <div v-if="imgsList.length < 7"> <a-icon type="plus" /> <div class="ant-upload-text"> 上传图片 </div> </div> </a-upload> </a-form-item> methods: { beforeUpload (file) { const isImage = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg' if (!isImage) { this.$notification['error']({ message: '上传格式错误', description: '请上传png/jpg/jpeg格式的图片', duration: 4 }) } const isLt2M = file.size / 1024 / 1024 < 2 if (!isLt2M) { this.$notification['error']({ message: '上传错误', description: '上传图片不能超过2M', duration: 4 }) } return isImage && isLt2M }, handleUploadChange ({ file, fileList }) { if (file.status === 'uploading') { // return true } const isLt2M = file.size / 1024 / 1024 < 2 if (isLt2M) { //校验成功的文件,添加到文件列表 this.imgsList = fileList } }, handleUploadRemove (info) { console.log(info) var arr = [] for (var i in this.imgsList) { if (this.imgsList[i].uid !== info.uid) { arr.push(this.imgsList[i]) } } this.imgsList = arr } }
猜你喜欢
- 【Vue】Vue常用框架介绍
- 现在的应用基本都是前后端分离,在国内,Vue相对来说更受欢迎一些,我们很多后端系统的前端都是Vue来开发的。那么Vue UI框架就显得尤为重要。Vue UI框架提供了一套丰富的用户界面组件及完整的前端UI解决方案,如按钮、表单、导航、布局等,使得开发者可以专注于业务逻辑开发,而不用从零构建这些常用的界面元素,帮助开发者更快速地构建高质量的用户界面。那么,都有哪些开源的UI框架呢?Element UIElement UI是一套为开发者、设计师和产品经理准备的基于Vue 2.0的组件库,提供了丰富的
- 【Vue】vue使用后端提供的接口
- 在 vue 中使用后端接口可通过以下步骤实现:安装 axios 库并导入。使用 axios 对象创建 http 请求,如 get 或 post。使用 data 选项传递数据。处理响应,使用 data 属性访问后端返回的数据。使用 vuex 管理从后端获取的数据,通过组件访问。在 Vue 中使用后端接口在 Vue.js 应用中使用后端提供的接口可以让你与服务器通信,获取和更新数据。本文将介绍如何在 Vue 中使用后端接口。1. 安装 Axios首先,你需要安装 Axios 库,这是一个用于发起 H
- 【Vue】vue2应用与vue3的不同之处
- 上一篇,我使用了vue2创建了一个应用,这次我使用vue3创建一个应用,看一下两者有什么不同。如下,是我用cue3创建的应用目录发现和vue2应用的目录一模一样,然后我用对比工具对比了两者的文件。1. 文件区别下面是package.json文件的区别,首先vue版本不同,对应的扩展组件也不同。下面是main.js的不同然后是APP.vue的不同2. 全局实例改变2.x 全局 API3.x 实例 API (app)Vue.configapp.configVue.config.productionT
- 【Vue】vue.js怎么定义一个组件
- vue.js 中定义组件有三种方法:直接定义在 <script> 标签中并导出组件对象、使用组件工厂函数和 definecomponent 辅助函数创建、使用类定义组件并继承 vue.extend 创建。</script>如何在 Vue.js 中定义组件一、直接定义1. 在 <script></script> 标签中,使用 export default {} 导出组件对象:<code class="html"&g
- 【VUE】Vue3+Vite+TypeScript常用项目模块详解
- 目录1.Vue3+Vite+TypeScript 概述1.1 vue3 1.1.1 Vue3 概述1.1.2 vue3的现状与发展趋势1.2 Vite1.2.1 现实问题1.2 搭建vite项目1.3 TypeScript1.3.1 TypeScript 定义1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍2. 项目配置简单概述2.1 eslint 校验代码工具配置2.1.1 eslint定义2.1
- 【Vue】Antd Pro Vue的使用(十) —— a-form表单赋值
- 在Ant Design Pro Vue中,为表单赋值通常涉及到两个方面:一是使用v-model进行双向绑定,二是直接通过this.form.setFieldsValue()方法设置表单字段的值。以下是一个简单的例子,展示如何为Ant Design Pro Vue中的表单赋值:首先,确保你已经在组件中引入了a-form-model和相关的表单字段组件比如a-form-model-item和a-input。在data函数中定义一个form对象,它包含了你想要绑定的表单字段。使用v-model指令将输
- 【Vue】Vue 单文件组件 (SFC) 规范
- 简介.vue 文件是一个自定义的文件类型,用类 HTML 语法描述一个 Vue 组件。每个 .vue 文件包含三种类型的顶级语言块 <template>、<script> 和 <style>,还允许添加可选的自定义块:
栏目分类全部>