解决element-ui组件库el-upload组件onProgress事件不触发的bug

5,048 阅读1分钟

微信图片_20220728094709.jpg

一、bug描述

在使用 element-uiel-upload 组件时,发现其中的 on-progress 事件无法触发导致配套使用的 el-progress 组件效果不生效。而且诡异的是这个问题只在生产环境出现,本地环境一切正常。

二、排查过程

1.既然是 production 环境下才有这个问题,第一想法就是全局搜索 “production” 关键字看下有没有一些特殊的配置,发现在main.js里面有关于mock的设置,如下图:

image.png

但暂时来看跟 el-upload 组件好像没任何关系

2.然后只能去源码里查查有没有线索,发现upload组件还自带了一个 ajax.js 文件

路径:./node_modules/element-ui/upload/src

8839a2b73f17ae78aff0ccc20ddf5f6.png

我们都知道,使用ajax进行文件上传时想要监控上传进度必须要依靠ajax里面的onprogress 方法(在axios中则是依靠 onUploadProgress 方法) image.png

3.再联想到之前的main.js文件里面mockjs的相关配置,打开mockjs的源码,问题答案就逐渐开始清晰起来了

路径:/node_modules/mockjs/src/mock.js image.png

三、问题原因

在production环境中由于开启了mock服务,mockjs自身会拦截请求且mockjs自己定义的xhr对象会覆盖掉el-upload 组件中定义的xhr对象。

四、解决办法:

1.如果确保项目不需要用到mockjs,可以像我一样简单粗暴直接注释掉

image.png

2.如果注释mockjs会对项目影响太大,el-upload组件还提供了一个 on-change() 方法,这个方法会在下载开始和下载完成都执行一次。可以自己手动去制造“进度条”增长的效果。

handleOnChange(file,fileList){
   if(file.status==='ready'){
   this.percentage =0;
   this.showProgress = true;
    const interval = setInterval(()=> {
        if (that.percentage >= 99) {
           clearInterval(interval)
           return;
        }
    },50)
   }
   
   if(file.status==='success'){
       this.percentage =100;
       this.showProgress = false;
   }
}