vue中message采用异步机制,它不会等到message执行完毕后才执行后面的代码。
后续代码如果是耗时较长的操作,将导致message显示异常。
如果message默认显示时间是4秒,下面代码运行结果是message只有1秒的时间显示(前3秒不显示,for循环完后才显示,尽管for循环在this.$message之后)
msgdemo() {
this.$message({
message: '恭喜你,这是一条成功消息',
type: 'success',
});
for(let i=Date.now();Date.now()-i<3000;){} //暂停3秒
}
因为this.\$message与for几乎是统一时刻执行(这时message实际上已经存在并开始计时),js的单线程机制使得在进行for循环的时候无法同步将message消息渲染到网页上,因此最终结果就是for循环完后,message才被渲染出来。其他的耗时操作,比如文件和数据库的读取都会受此影响,解决办法是给比较耗时的代码块包装到setTimeout函数中,使起比this.$message稍微晚一点点执行
修改后的代码如下:
msgdemo2() {
this.$message({
message: '恭喜你,这是一条成功消息',
type: 'success',
});
setTimeout(()=>{
for(let i=Date.now();Date.now()-i<5000;){}
},100)
},