Mounted 中的类更改不会触发过渡 vuejs

Posted

技术标签:

【中文标题】Mounted 中的类更改不会触发过渡 vuejs【英文标题】:class change in Mounted not triggering transition vuejs 【发布时间】:2018-07-17 10:50:35 【问题描述】:

当我尝试在已挂载的生命周期中向元素添加类时,过渡效果不起作用。该元素立即作为最终状态出现:

但是,如果我使用 setTimeout 来延迟类更改,则转换将起作用。

new Vue(
  el: '#example-1',
  mounted: function ()  
     // setTimeout(function () 
      let test = document.getElementsByClassName('test')[0]
      test.classList.add('loaded')
     // , 0) 
  
)
.test 
  color:red;
  font-size:60px;
  transform:none;
  transition: all 1s linear;


.test.loaded 
  transform: translateX(400px)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>


<div id="example-1">
  <h1 class='test'>
    fa
  </h1>
</div>

我明白为什么会发生这种情况,如果它在 vanilla js 中:转换需要从一个渲染状态到另一个渲染状态。延迟是为了允许首先渲染初始元素。(Refer to this SO post)

但是在 Vue 中,我认为 Mounted 已经意味着初始视图已经渲染。所以已经有一个初始渲染状态。

从这个例子看来,情况并非如此。

所以挂载了!== 渲染了吗?

【问题讨论】:

Mounted 是用新的虚拟 DOM 替换真实 DOM。它不会满足您的需求。 @skribe 为什么会这样?如果mounted意味着真实DOM被虚拟DOM替换,那么在我修改mounted中元素的类之前,真实DOM中应该已经有一个初始渲染元素 我确信它是如何工作的所有基础,我只知道我尝试过类似的事情并且失败了。 DOM 被渲染然后挂载。在这里查看另一种方法来做你似乎想要做的事情。 ***.com/questions/40618894/… @strike 使用过渡组件是一个好方法。但是我仍在尝试找出原因。我也尝试过使用类绑定并做:this.loaded = true 来更改阶段,从而触发挂载的类更改。还是不行。 【参考方案1】:

如果你在元素被添加到 DOM 之后立即添加类,浏览器将无法触发 CSS 转换,因为当浏览器检查转换时,它也会检查之前应用的转换,结果是没有,因此它跳过过渡。这就是为什么你需要一些setTimeoutrequestAnimationFrame 来使它工作。 这是一个没有 Vue 的演示 ?

const a = document.createElement('div')
a.textContent = 'fa'
a.classList.add('test')
document.body.appendChild(a)
a.classList.add('loaded')

【讨论】:

以上是关于Mounted 中的类更改不会触发过渡 vuejs的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs中关于computedmethodswatch,mounted的区别

Vuejs中关于computedmethodswatch,mounted的区别

VueJs - 使用过渡更改 div 颜色

我的 vuejs 动画/过渡滞后于路径更改。

对挂载中的属性的更改未触发在 VueJS 中计算

CSS3。 VueJS。动态过渡背景渐变