el-upload上传文件取消默认直接上传,改为手动上传

el-upload上传文件取消默认直接上传,改为手动上传

html部分
<el-upload
      ref="upload"
      :accept="fileType.join(',')"
      :limit="1"
      :headers="upload.headers"
      :action="upload.url"
      :before-upload="beforeUpload"
      :disabled="upload.isUploading"
      :on-progress="handleFileProgress"
      :on-success="handleFileSuccess"
      :auto-upload="false"
      :data="dataInfo"   //绑定对象 若需要传递多个参数时使用  不需要则去掉
      drag
    >
      <i class="el-icon-upload" />
      <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
      <div slot="tip" class="el-upload__tip" style="color: red">
        提示:仅允许导入“xls”或“xlsx”格式文件!
      </div>
    </el-upload>
JS部分
import { getToken } from "@/utils/auth";

export default {
  name: "MesDeptProjectMouthWorkingDetail",
  data() {
    return {
        upload: {
        // 设置上传的请求头部
        headers: { Authorization: getToken() },
        // 上传地址
        url: process.env.VUE_APP_BASE_API + '/importData/upload',
        // 是否更新已经存在的用户数据
        isUploading: false
      },
      dialogVisiblefile: false,
      fileType: ['.xlsx', '.xls'],
      dataInfo: {
        deptId: null,
        yearAndMouth: null
          //不需要设置上传文件的参数 file
      },
    },
     methods:{
          beforeUpload(file) {
              const isExcel = /\.(xls|xlsx)$/.test(file.name);
              if (!isExcel) {
                this.$message.error('上传文件只能是 .xls、.xlsx 格式!');
                return false;
              }
              return true;
            },
            // 文件上传中处理
            handleFileProgress() {
              this.upload.isUploading = true
            },
            // 文件上传成功处理
            handleFileSuccess() {
              this.upload.isUploading = false
              this.$refs.upload.clearFiles()
            },
            // 提交上传文件
            submitUpload() {
              this.dialogVisiblefile = false
              this.$refs.upload.submit()
        	},
     	}
  	}
}
<think>我们正在处理一个关于el-upload组件的问题:用户想知道如何在文件上传后,在文件名后面显示“已上传”的状态提示。 根据引用[2]中提到的代码片段,我们可以看到一个典型的el-upload组件的使用方式。其中有一个属性`:file-list`绑定到了`form._digitalMediaDtoList`,这个数组存储了文件列表的信息。 在el-upload组件中,每个文件的状态(包括上传成功、上传失败等)是通过文件对象的status属性来控制的。当文件上传成功时,我们应该将文件对象的status设置为'success',这样组件就会自动显示一个成功标志(通常是一个绿色的勾,也可以理解为“已上传”的标识)。 但是,用户提到“文件后面的成功标志没有出来”,这可能是因为没有正确设置文件对象的status属性。 解决方案: 1. 确保在文件上传成功后,将文件对象添加到file-list中,并且设置其status为'success'。 2. 或者,如果我们使用自动上传(即设置`auto-upload`为true),那么组件在上传成功后会自动更新文件状态。但是,如果我们是手动上传(通过http-request自定义上传),那么我们需要在自定义上传方法中手动设置文件状态。 根据引用[2]中的代码,用户使用了`:http-request="upload_file"`,这意味着用户使用了自定义上传方法。因此,我们需要在`upload_file`方法中处理上传成功的逻辑,并更新文件状态。 具体步骤: - 在`upload_file`方法中,当文件上传成功时,我们需要更新该文件对象的状态为'success'。 - 文件对象在`upload_file`方法的参数中可以获取到。 另外,我们也可以在上传成功的回调函数中设置。但是注意,引用[2]中并没有使用`:on-success`回调,而是使用了`http-request`覆盖了默认上传行为,所以我们需要在自定义上传函数中处理成功和失败。 示例代码: 在`upload_file`方法中: ```javascript methods: { upload_file(file) { // 这里执行上传操作,比如使用axios const formData = new FormData(); formData.append('file', file.file); // 注意:file参数是一个对象,其中file属性才是真正的文件对象 axios.post('/upload', formData).then(response => { // 上传成功,更新文件状态 file.onSuccess(response); // 调用onSuccess来更新文件状态 // 或者我们可以手动更新file-list中的文件对象 // 但是更推荐调用file.onSuccess,因为这样组件内部会处理状态更新 }).catch(error => { file.onError(error); // 上传失败,调用onError }); } } ``` 注意:在自定义http-request中,参数file是一个对象,它包含以下属性: - file: 当前上传文件(原始文件对象) - onSuccess: 上传成功后的回调函数,调用它并传入响应结果,组件会更新文件状态 - onError: 上传失败的回调函数,调用它并传入错误信息 - onProgress: 用于更新上传进度的函数 因此,在上传成功时调用`file.onSuccess(response)`,组件就会自动将该文件的状态设置为'success',从而显示成功标识(一个绿色的勾)。 但是,如果用户希望显示的文字是“已上传”而不是一个图标,那么可能需要自定义模板。el-upload组件允许我们通过插槽来自定义文件列表的呈现方式。 我们可以使用`scoped-slot`来自定义文件列表,例如: ```html <el-upload action="#" :file-list="fileList" :http-request="upload_file"> <!-- 其他内容 --> <template #file="{ file }"> <div> <span>{{ file.name }}</span> <span v-if="file.status === 'success'">(已上传)</span> </div> </template> </el-upload> ``` 这样,当文件状态为'success'时,就会在文件名后面显示“(已上传)”。 但是,注意:使用这个插槽会覆盖整个文件列表项的显示,因此我们需要完整地实现一个文件列表项,包括删除按钮、上传进度等。如果只需要在原有样式的基础上加一个文字提示,我们可以考虑使用更局部的修改。 实际上,el-upload组件默认的列表项中,在状态图标后面会显示文件状态(成功、失败、上传中),但通常是用图标表示的。如果我们想要添加文字,可以通过自定义列表项来实现。 另一种更简单的方法:我们可以使用`:on-success`回调,然后给文件对象添加一个自定义属性,然后在模板中根据这个属性显示文字。但这样需要自定义文件列表。 考虑到用户可能希望保留默认的样式,只增加一个文字提示,我们可以尝试在文件列表项中通过CSS选择器在状态图标后面添加文字。但是,这可能会破坏原有结构,而且el-upload没有提供这样的接口。 因此,推荐使用自定义文件列表模板(scoped slot)来灵活控制。 自定义文件列表模板示例: ```html <el-upload class="upload-demo" action="#" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList" :http-request="upload_file" :auto-upload="true"> <!-- 其他内容,比如触发上传的按钮 --> <template #file="{ file }"> <li class="el-upload-list__item"> <a class="el-upload-list__item-name" @click="handlePreview(file)"> <i class="el-icon-document"></i>{{ file.name }} </a> <label class="el-upload-list__item-status-label" v-if="file.status==='success'"> <i class="el-icon-upload-success el-icon-circle-check"></i> <span>已上传</span> </label> <i class="el-icon-close" @click="handleRemove(file)"></i> </li> </template> </el-upload> ``` 注意:这里我们完全模拟了默认文件列表项结构,并添加了一个`<span>已上传</span>`。但是,这样需要我们自己处理样式,以保持和原有样式一致。 如果不想这么麻烦,我们可以只修改状态图标后面的内容,但默认情况下,状态图标后面没有文字。因此,我们可以在状态图标旁边添加文字。 另外,我们可以通过修改状态图标的显示方式,在图标后面添加文字: ```html <label class="el-upload-list__item-status-label" v-if="file.status==='success'"> <i class="el-icon-upload-success el-icon-circle-check"></i> 已上传 </label> ``` 这样,状态区域就会显示一个图标和“已上传”文字。 但是,请注意,这个自定义模板会覆盖整个文件列表项,因此我们需要确保整个列表项的结构和样式与原有的一致,否则可能会影响其他功能(如删除按钮、预览按钮等)。 总结: 1. 确保文件上传成功后,文件对象的status被设置为'success'(通过自动上传手动调用onSuccess)。 2. 使用scoped slot自定义文件列表项,在状态区域添加“已上传”文字。 如果用户不想自定义整个文件列表项,也可以考虑使用CSS在状态图标后面添加文字,但这样可能不够灵活,且依赖于组件的内部结构,如果组件升级可能会失效。 因此,推荐使用自定义模板的方式。 注意:在自定义模板中,我们也要实现删除和预览等功能,即调用原有的`handleRemove`和`handlePreview`方法。 下面是一个完整的自定义文件列表项的例子(保留删除和预览功能): ```html <template> <el-upload class="upload-demo" action="#" :on-preview="handlePreview" :on-remove="handleRemove" :file-list="fileList" :http-request="upload_file" :auto-upload="true"> <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传不超过500kb的文件</div> <template #file="{ file }"> <li class="el-upload-list__item"> <a class="el-upload-list__item-name" @click="handlePreview(file)"> <i class="el-icon-document"></i>{{ file.name }} </a> <label class="el-upload-list__item-status-label" v-if="file.status==='success'"> <i class="el-icon-upload-success el-icon-circle-check"></i> 已上传 </label> <i class="el-icon-close" @click="handleRemove(file)"></i> </li> </template> </el-upload> </template> ``` 注意:样式可能需要调整,因为原组件有很精确的样式。我们可以参考element ui官方文档中关于上传组件自定义文件列表的示例。 最后提醒:如果用户不需要自定义模板,而只是希望看到成功图标(它本身就是一个“已上传”的视觉提示),那么确保文件状态正确设置为'success'即可,成功图标(绿色对勾)就会显示出来。 如果用户坚持要文字,那么采用自定义模板的方式。 根据用户的问题描述,他想要在“文件名后面”显示“已上传”的状态提示,所以我们可以采用在文件名后面添加文字的方式,而不改变状态图标的位置。那么可以这样修改: ```html <template #file="{ file }"> <li class="el-upload-list__item"> <a class="el-upload-list__item-name" @click="handlePreview(file)"> <i class="el-icon-document"></i>{{ file.name }} <span v-if="file.status==='success'" style="color: #67c23a; margin-left: 5px;">(已上传)</span> </a> <label class="el-upload-list__item-status-label" v-if="file.status==='success'"> <i class="el-icon-upload-success el-icon-circle-check"></i> </label> <i class="el-icon-close" @click="handleRemove(file)"></i> </li> </template> ``` 这样,在文件名后面就会显示绿色的“(已上传)”文字,同时状态图标仍然保留(在右侧)。 这样应该可以满足用户的需求。 因此,最终方案: 1. 确保上传成功时文件状态设置为'success'(通过调用onSuccess)。 2. 使用自定义文件列表模板,在文件名后面添加一个span来显示“(已上传)”,同时保留状态图标(也可以选择隐藏状态图标,但这里保留)。 注意:由于我们自定义了文件列表项,所以需要确保整个列表项的样式和功能(删除、预览)都正常。上面的代码保留了这些功能。 如果用户不需要自定义整个文件列表项,也可以考虑使用其他方法,但根据element ui的限制,自定义模板是最直接有效的方法。</think>要解决 el-upload 组件上传文件后显示“已上传”状态提示的问题,可通过以下两种方法实现: ### 方法一:使用内置状态图标(推荐) el-upload 默认会在上传成功时显示绿色勾选图标作为"已上传"标识。确保正确配置以下属性: ```html <el-upload action="/api/upload" <!-- 上传接口地址 --> :on-success="handleSuccess" <!-- 上传成功回调 --> :file-list="fileList" <!-- 绑定文件列表 --> :auto-upload="true"> <!-- 开启自动上传 --> <el-button>上传文件</el-button> </el-upload> ``` ```javascript export default { data() { return { fileList: [] // 存储上传状态 }; }, methods: { handleSuccess(response, file) { // 文件状态会自动更新为'success' // 此时文件列表项会显示绿色勾选图标 } } }; ``` **效果说明**: 上传成功后,文件右侧会自动显示 <i style="color:#67C23A">✓</i> 图标,这是Element UI默认的"已上传"状态标识[^2]。 ### 方法二:自定义文字提示(使用插槽) 若需显示文字提示,可通过`scoped-slot`自定义文件列表: ```html <el-upload :file-list="fileList"> <template #file="{ file }"> <div> <span>{{ file.name }}</span> <span v-if="file.status === 'success'" style="color:#67C23A;margin-left:8px"> (已上传) </span> </div> <el-progress v-if="file.status === 'uploading'" :percentage="file.percentage" stroke-width="2" /> </template> </el-upload> ``` **关键配置**: 1. 通过`file.status`判断上传状态(`success`/`uploading`/`fail`) 2. 使用条件渲染显示自定义文字提示 3. 保留进度条提升用户体验 ### 常见问题排查 1. **状态图标不显示**: - 确认已设置`:file-list="fileList"`并绑定响应式数组 - 检查`on-success`回调中未手动修改文件状态 - 确保CSS未被覆盖(检查`.el-icon-circle-check`样式) 2. **自定义提示不更新**: ```javascript // 手动更新文件状态(必要时) this.fileList = [...this.fileList]; // 触发视图更新 ``` 3. **后端对接注意事项**: - 上传接口需返回标准格式响应: ```json { "code": 200, "data": { "url": "/file-path" } } ``` - 错误处理显示失败状态: ```html <span v-if="file.status === 'fail'" style="color:#F56C6C">(上传失败)</span> ``` > 提示:Element UI 3.x+ 版本内置状态图标已满足多数场景,优先推荐方法一。如需特殊样式(如文字提示),可采用方法二的自定义方案[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涔溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值