[Vue] 解决element-ui消息提示$message重叠问题

0 阅读1分钟

贴一段代码

image.png

函数中程序同步执行,先后触发两个message,此时两个message,此时两个message的弹窗重叠

image.png

预期的情况是下图这样一上一下出现

image.png

这因为vue的异步更新队列有缓冲机制,第一次message触发时,并没有更新dom,导致第二个message触发时,并没有更新dom,导致第二个message取item.el.offsetHeight取到的高度为0,所以第二个el.offsetHeight取到的高度为0,所以第二个message只是下移了默认的offset(即16px),并没有加上第一个$message的offsetHeight。

解决这个问题的办法

1、如果是单一场景,用$nextTick处理

this.$nextTick(() => {
    this.$message(...);
});

可以保证dom更新之后再触发message,正确的获取到message,正确的获取到el.offsetHeight

image.png

2、将第二个message写在setTimeout回调函数中(其思想与message写在setTimeout回调函数中 (其思想与nextTick同理)

3、async + await

image.png 注:
如果有多个(>=3个)messagemessage,nextTick以及await只能解决第1个与第2个重叠的情况,第2个、第3个还会重叠,这种情况改用setTimeout。

完结。