需求:
在批量打印时显示正在打印第几张,我们在使用循环打印时,是无法直接通过this.xxx的形式去修改的,因为修改了也无法立即作用到页面中,vue会等待循环结束之后再进行统一的页面更新。
解决:
网上有很多方式去解决,甚至使用 this.$forceUpdate()
去强制进行更新,但在我的项目中依旧无法解决,因为实践发现this.$forceUpdate()
也会等这个循环结束才会执行,那明显不符合要求。
关键:由于 vue 在事件循环周期结束时才会更新视图(底层逻辑!)
所以到这里我们就能够有一些思路,只要在循环当中加入一个事件,并且让其周期快速结束,那么问题就解决了,什么事件满足要求呢,答案之一就是Promise
。直接看解决方式吧:
...
await new Promise(resolve => setTimeout(resolve, 0)) // 待下一个事件得环局期
const currentIndex = index
this.$set(this, "current", currentIndex)
...
上面三行代码可以让我们在循环一次之后立即更新视图,再进行下一次循环。或者看图:
其它坑点:
在上图中有一个注释解释了为何用for
循环。起初用的是forEach
循环的方式,但无法在循环报错的情况下终止循环,依旧会继续下一次循环。本来我挺犟,就是想用forEach的方式,但尝试了各种各样的办法,什么try catch
啊 return false
啊 throw new error()
啊等等等等,但是都解决不了,后面用了for循环就解决了。所以说啊,人不能太犟,那是驴!!tip:forEach 不能用continue
、break
的方式终止循环。