记录一个十分奇怪的前端关于loading的bug

文章讲述了在Vue项目中,初始化时loading无法正确显示的问题,因为两个异步API调用的时间差导致了loading提前变为false。解决方法包括优化API调用顺序或为相关table添加独立loading。

源代码如下,问题在于在初始化的时候loading总是无法正确加载,明明queryAllCoupon中的数据并没有挂载完毕loading却失效了。

      queryAllCoupon () {
        const queryParams = this.getQueryParams()
        this.loading = true
         api.queryAllCoupon(queryParams).then(res => {
          if (res.code === 0) {
           this.couponCodeList = res.result.list
           this.pagination.total = res.result.totalCount
          }
          this.loading = false
         })
      },
      getCouponTypeList () {
        this.loading = true
         api.getCouponTypeList().then(res => {
          this.loading = false
           this.couponTypeList = res.result
         })
      },
        created () {
        this.getCouponTypeList()
        this.queryAllCoupon()
    }

一开始我以为是queryAllCoupon方法中couponCodeList并没有加载完毕就渲染了,但是仔细看了以前的代码发现都是这样写的却没有错,都是在等待数据挂载完毕后再将loading设为false,既然不是vue2挂载数据的问题,那么问题就出在了loading身上,经过一番尝试找到了问题,在我的queryAllCoupon方法中,在我将this.loading设为false之前,loading就已经被设为false了,经过断点测试,接下来将正确的执行顺序标注。

  queryAllCoupon () {
       3  const queryParams = this.getQueryParams()
       4  this.loading = true
        5 api.queryAllCoupon(queryParams).then(res => {
          if (res.code === 0) {
          8 this.couponCodeList = res.result.list
         9  this.pagination.total = res.result.totalCount
          }
        10  this.loading = false
         })
      },
      getCouponTypeList () {
         1 this.loading = true
        2  api.getCouponTypeList().then(res => {
         6 this.loading = false
          7 this.couponTypeList = res.result
         })
      },
        created () {
        this.getCouponTypeList()
        this.queryAllCoupon()
    }

可以看出,在我挂载couponCodeList 的数据之前,loading的值已经被改为了false,之前我一直以为created函数中的执行顺序是同步的,但现在看来也并不是完全同步的,他们只是发送完请求之后就开始执行其他的函数了,以往这样写loading没有出错是因为两个函数执行时间差不多看不出来loading的变化,而这两个函数的执行时间差距很大,一个方法查询只有两条数据,一个有上百万条,导致了时间短的函数先执行完毕先一步更改了loading。解决方法有两个,去掉执行时间短的loading改变,或者couponCodeList对应的table设置另一个loading

前端实现图标加载动画效果,通常可以通过以下几种方法来实现,具体选择取决于项目需求、维护性以及动画的复杂程度。 ### 1. 使用 CSS3 实现简单的图标加载动画 通过 CSS3 的 `@keyframes` 和 `transform` 属性,可以实现基本的旋转、缩放等动画效果。例如,使用一个图标字体(如 Font Awesome)或 SVG 图标,结合旋转动画来实现加载效果。 ```css .loading-icon { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } ``` ```html <i class="loading-icon fa fa-spinner"></i> ``` 这种方式实现简单,适合轻量级需求,但可定制性和扩展性较差,若未来需求变更,维护成本可能较高[^1]。 ### 2. 使用 SVG 实现更精细的加载动画 SVG 提供了更强大的图形控制能力,适合实现复杂的加载动画。可以通过 `stroke-dasharray` 和 `stroke-dashoffset` 属性来控制描边动画,实现类似进度条的加载效果。 ```css .loading-circle { stroke-dasharray: 100; stroke-dashoffset: 100; animation: dash 2s ease-in-out infinite; } @keyframes dash { to { stroke-dashoffset: -100; } } ``` ```html <svg width="50" height="50" viewBox="0 0 50 50"> <circle class="loading-circle" cx="25" cy="25" r="20" fill="none" stroke="#000" stroke-width="2"/> </svg> ``` 这种方式适合对动画细节有更高要求的场景,同时 SVG 也具备良好的响应式特性[^4]。 ### 3. 使用第三方动画库(如 Loading.IO) 如果希望快速实现高质量的动画效果,可以使用如 Loading.IO 这样的动画平台。它提供丰富的预设动画模板,并支持导出为 CSS、SVG 或 JavaScript 动画,方便嵌入到现有项目中。用户只需简单配置即可生成复杂的加载动画,极大降低了开发门槛和维护成本[^3]。 ### 4. 使用 JavaScript 动态控制动画 对于需要动态控制动画状态(如根据加载进度调整动画)的场景,可以结合 JavaScript 控制 SVG 或 CSS 动画的状态。例如: ```javascript const circle = document.querySelector('.loading-circle'); let progress = 0; function animateProgress() { progress += 1; circle.style.strokeDashoffset = 100 - progress; if (progress < 100) { requestAnimationFrame(animateProgress); } } animateProgress(); ``` 此方式适合需要与业务逻辑紧密结合的加载动画场景[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值