我正在尝试将一些内联样式应用于mounted hook中的元素,作为过渡的起始点。
mounted() {
this.styles = {
backgroundColor: 'silver'
};
之后,在下一个刻度,我想添加一组新样式,并让过渡发生
this.$nextTick(() => {
this.styles = {
backgroundColor: 'gold'
}
});
}
这并没有像我期望的那样工作,它立即以第二种样式呈现元素。
如果我用setTimeout
替换$nextTick
,它会像预期的那样工作。
我错在哪里?必须有一种方法来实现这一点,而不依赖于超时。
我在这里重现了这个问题
PS我知道我可以用Vue过渡做到这一点,但在实际项目中应用的样式更复杂&都是程序化计算的,所以我宁愿用js来做,而不是css
您说过它使用setTimeout
工作。在你的例子中,我可以看到你在超时中等待了100毫秒。$nextTick
持续时间比那短。它不等待下一个event loop
。
我知道这不是你所期望的,但这就是它的工作原理。您需要等待另一个event loop
。即使使用timeout
和0
也能达到同样的效果。
setTimeout(() => {
this.styles = {
backgroundColor: 'pink'
}
}, 0);
在你的情况下,两次渲染之间几乎没有延迟。要查看silver
如何变成gold
,可以调用setTimeout
:
this.$nextTick(() => {
setTimeout(() => {
this.styles = {
backgroundColor: 'gold'
}
}, 1000)
});
我不确定你应该使用它作为一个现成的解决方案,因为它是更好的使用CSS过渡。也许你不仅需要改变样式,还需要添加一些类,以便在样式计算完成后打开CSS过渡。