【前端学习记录】vue中使用el-upload组件时,上传文件进度条没有实时更新

这篇具有很好参考价值的文章主要介绍了【前端学习记录】vue中使用el-upload组件时,上传文件进度条没有实时更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

今天在项目中遇到一个问题,使用el-upload组件时,上传文件进度条没有实时更新,需要手动点击一下才会更新。

原理及可尝试方案

el-upload 组件默认的进度条是通过 Ajax 请求上传文件,并且进度条通过监听 xhr.upload 的 progress 事件来实时更新。但是,有些浏览器在处理进度事件时可能会存在问题,导致进度条不会实时更新。

如果进度条没有实时更新,可以尝试使用 el-upload 组件提供的 on-progress 事件来手动更新进度条。具体做法是在 on-progress 事件处理函数中,将上传进度值赋给进度条的 percentage 属性。如下所示:

<el-upload
  action="/upload"
  :on-progress="handleUploadProgress"
>
  <el-button slot="trigger" size="small" type="primary">点击上传</el-button>
</el-upload>
methods: {
  handleUploadProgress(event, file, fileList) {
    // 计算上传进度
    const progress = Math.ceil((event.loaded / event.total) * 100);
    // 将进度赋给进度条的 percentage 属性
    file.percentage = progress;
    // 如果不使用 file.percentage 属性,而是使用 fileList 的方式更新进度条,请参考下面的代码
    // const index = fileList.findIndex(item => item.uid === file.uid);
    // fileList[index].percentage = progress;

    // 强制更新 DOM
    this.$forceUpdate();
  }
}

在 handleUploadProgress 方法中,计算上传进度并将进度赋给 file.percentage 属性。然后,使用 this.$forceUpdate() 强制更新 DOM,使进度条实时更新。

这种方法可以解决进度条不实时更新的问题,但要注意的是,在每次更新进度条时,可能会导致组件重新渲染,因此如果列表中有其他需要保留的状态,要注意在更新前先保存这些状态,以免丢失。

查文档

<el-upload
  class="upload-demo"
  action="https://jsonplaceholder.typicode.com/posts/"
  :on-progress="handleProgress"
  :on-preview="handlePreview"
  :on-remove="handleRemove"
  :before-remove="beforeRemove"
  multiple
  :limit="3"
  :on-exceed="handleExceed"
  :file-list="fileList">
  <el-button size="small" type="primary">点击上传</el-button>
  <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>

on-progress 为文件上传时的钩子,回调函数为 function(event, file, fileList),经过测试,在代码上传时,会定时触发该方法,在event中会定时更新返回的进度,但是页面上没有发生变化,判断问题的原因是dom没有更新。

最终,在handleProgress中增加this.$forceUpdate();问题解决。

this.$forceUpdate();

this.$forceUpdate() 是 Vue 实例的一个方法,用于强制刷新组件的 DOM。它会导致组件重新渲染,即使没有进行数据的改变。

在 Vue 中,组件的渲染是响应式的,当数据发生变化时,Vue 会自动更新组件的 DOM。但有时候,我们希望手动触发组件的重新渲染,即使数据没有改变。这时就可以使用 this.$forceUpdate() 方法。

this.$forceUpdate() 方法会使组件的 render 函数重新执行,生成新的 VNode,并对比新旧 VNode 的差异来更新 DOM。它会跳过组件实例的依赖追踪,直接强制刷新整个组件。

注意1: this.$forceUpdate() 方法在应用程序中一般不常用。在大多数情况下,Vue 会自动追踪响应式数据的变化并更新组件,不需要手动调用 this.$forceUpdate()。只有在某些特殊情况下,例如当组件的渲染依赖于非响应式数据或外部事件时,才需要使用它。

注意2:this.$forceUpdate() 只会触发当前组件的重新渲染,而不会影响其父组件或子组件的重新渲染。如果需要更新父组件或子组件的 DOM,应该使用相应的机制,如父子组件之间通过 prop 和事件交互。

总结一下,this.$forceUpdate() 方法是 Vue 实例上的一个方法,用于强制刷新组件的 DOM,即使数据没有改变。但一般情况下,不建议频繁使用该方法,而是依赖 Vue 的自动响应式机制来更新组件的 DOM。文章来源地址https://www.toymoban.com/news/detail-789940.html

到了这里,关于【前端学习记录】vue中使用el-upload组件时,上传文件进度条没有实时更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • vue+el-upload(封装华为云OBS上传文件)前端直传

    vue+el-upload(封装华为云OBS上传文件)前端直传

    注释:代码中###是需要填写自己东西的 以上代码为封装的组件代码,需要引入父组件后调用配置 下面图为组件调用,注册跟引入就不用我多说了吧,不会的自行百度 注:华为云前端直接上传的话会出现跨域报错,把华为云OBS CORS跨域规则设置一下 我设置的规则全部打开了

    2024年02月05日
    浏览(36)
  • 使用el-upload组件实现递归多文件上传

    使用el-upload组件实现递归多文件上传

    一、需求描述:在页面上点击按钮弹出选择电脑文件的界面,可以一次性选择多个文件一起上传到服务器上,并把上传成功的文件展示在页面上。 · 二、 问题阐述:el-upload是支持多文件上传的,但是是同步进行的,你点击上传按钮,选择了多个文件后点击确定,会同时调用

    2023年04月08日
    浏览(7)
  • vue+elementui中el-upload组件上传文件时,修改文件名,不用FormData

    vue+elementui中el-upload组件上传文件时,修改文件名,不用FormData

    今天在开发的时候,后端突然提了一个需求,因为特殊的文件上传不进文件服务器,所以后端问我能不能上传的时候给加个扩展名,本着只要逻辑没问题,都可以通过代码实现的理念,我说:“可以“”,于是乎有了这篇文章。 首先是去element官网逛了逛,发现也没有提供修

    2024年02月06日
    浏览(9)
  • vue 使用 el-upload 上传文件(自动上传/手动上传)

    vue 使用 el-upload 上传文件(自动上传/手动上传) 上传 上传

    2024年02月13日
    浏览(38)
  • Vue+Element(el-upload+el-form的使用)+springboot

    Vue+Element(el-upload+el-form的使用)+springboot

    目录 1、编写模板  2、发请求调接口  3、后端返回数据 1.编写实体类 2.Controller类  3、interface接口(Service层接口)  4.Service(接口实现) 5、interface接口(Mapper层接口) 6、xml 7、goods.sql 8、goods_img 4、upload相关参数   说明(该案例是一个el-form和el-upload结合的,逻辑是:需要

    2024年01月25日
    浏览(20)
  • vue 2.0+element ui 使用el-upload图片上传

    vue 2.0+element ui 使用el-upload图片上传

    ** ** 使用el-upload将图片加载成Base64格式,通过form统一上传给后端 1、创建通用component ImgComponent.vue 2、在父组件中使用 3、最后通过form统一submit到后端,图片参数传base64即可。 ps:起初在数据库中,将存图片的字段类型设置为BLOB,以二进制的形势存储,后面发现会将“:”转

    2024年02月12日
    浏览(31)
  • el-upload组件问题 已解决

    el-upload组件问题 已解决

    前两天我写了一个上传下载功能 使用el-upload组件 当后端将文件流格式数据发送到响应里面前端屈接受的时候 ,我们使用 el-upload 组件里面的 :on-success 方法进行捕捉,使用blob进行文件下载 文件可以正常下载下来 但是打开文件损坏   我去网上寻找答案, 但大多都是说 请求头

    2024年02月03日
    浏览(4)
  • Vue中使用的el-upload时批量上传图片时报错问题处理

    Vue中使用的el-upload时批量上传图片时报错问题处理

    项目场景:项目中有一个文件上传的场景,使用el-upload组件进行上传,单图上传是正常,但是在进行批量上传时报了错。 使用el-upload在进行多图批量上传时系统提示报错。 报错提示: Uncaught TypeError: Cannot set properties of null (setting \\\'status\\\')     at VueComponent.handleProgress (element-ui

    2024年02月06日
    浏览(123)
  • Vue3使用ElementPlus中的el-upload手动上传并调用上传接口

    实体类 定义接口 上传文件并插入数据库数据

    2024年01月20日
    浏览(34)
  • vue3 - 使用element-plus组件库el-upload上传超大mp4视频分片上传,Upload上传大文件mp4视频进行切片分段上传到后端服务器教程,vue3如何上传很大的视频(详细示例代码

    vue3 - 使用element-plus组件库el-upload上传超大mp4视频分片上传,Upload上传大文件mp4视频进行切片分段上传到后端服务器教程,vue3如何上传很大的视频(详细示例代码

    在vue3+elementPlus中,使用el-upload组件\\\"切片分段\\\"上传mp4大视频到服务器,支持任意大视频、大文档、大压缩包等超大文件,通用方法将其拆分成多个小段进行逐个逐条上传到后端(支持断点续传、下载预览)。 详细大文件分片功能源码,可只拿前端源码或只拿springboot(Java)后

    2024年03月16日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包