vue项目中发现的一个问题。
项目中使用axios去请求接口,每次请求都伴随着一个element ui的el-loading的加载动画,可是在一个画面里,请求接口的时候没有看到loading动画。
刚开始我只是粗略地看了下画面,就定位到了axios里,心想是不是这个el-loading写法的问题,看了几遍没有发现问题,便切回浏览器又看了看画面,还是没有找到原因。接着我又看了几个有相同问题的画面,发现出现问题的点都在于,没有loading动画的地方都有打开el-dialog对话框的操作。再次切回第一个画面的时候,才知道为什么第一次没有发现这个问题。是因为第一个画面打开对话框时,API的请求时间太短了,导致el-loading动画还没有加载出来就被销毁。
仔细看了几个画面,打开对话框的时候,其实是有loading动画的,但是被对话框挡住了。刚打开对话框的时候,对话框的下面是能看到loading动画的遮罩层的。
定位了问题以后我开始尝试解决。参照element ui的文档,我尝试改变loading的options参数,但很不幸,没有起效。隔了一天,再次看这个问题的时候,忽然发现代码里是先去请求API,再打开对话框(将Dialog的visible属性设置成ture)。
我尝试将两行代码调换位置,但结果依然令人沮丧。打开对话框时,依然看不到那个朝思暮想的Loading圈圈。后来想想觉得挺蠢的,ajax是异步执行的,肯定在赋值语句后执行,那么难道el-dialog是在loading动画后渲染的?。想到这里,忽然茅塞顿开。
如果在对话框打开以后,再请求API,是不是就可以了。我便将请求API的语句放在Dialog 打开动画结束时的回调函数 opened中。果然,这次我打开对话框的时候,loading动画覆盖在了对话框之上,成功解决问题!
记在最后,关于前端中,各种执行,渲染的顺序还需要继续深入了解才是。