首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Vue.js [v-斗篷]不使用CSS转换。

Vue.js [v-斗篷]不使用CSS转换。
EN

Stack Overflow用户
提问于 2018-06-14 14:19:22
回答 2查看 2.6K关注 0票数 8

我的意图:

使用Vue.js (v2)属性v2,我希望在准备就绪之前隐藏"app“。当v斗篷被移除时,我想要“应用程序”淡入。使用CSS的不透明度和过渡来实现淡出。

问题:

当v斗篷被从我的“应用程序”中移除时,没有我所期望的转换。它很快就会从隐藏变为可见。似乎忽略了CSS。

示例:

我用Vue.js和JavaScript模拟版本做了一个夸张的例子,展示了它们的行为。

https://codepen.io/freemagee/pen/wXqrRM

当查看此示例时,您将看到“纯旧JavaScript”红色框在5秒以上消失。但Vue控制版本的出现并没有褪色。他们在转换过程中共享相同的CSS,因此理论上应该以同样的方式工作。

有人用v斗篷来实现平稳过渡吗?

代码

HTML

代码语言:javascript
运行
复制
<div id="app" v-cloak>
  <div class="red-box"></div>
  <p>Vue.js {{ message }}</p>
</div>

<div id="app2" v-cloak>
  <div class="red-box"></div>
  <p>Plain old JavaScript</p>
</div>

CSS

代码语言:javascript
运行
复制
html,
body {
  margin: 0;
  height: 100%;
  min-height: 100%;
}

[v-cloak] .red-box {
  opacity: 0;
  visibility: hidden;
  transition: visibility 0s 5s, opacity 5s linear;  
}

#app,
#app2{
  padding-top: 50px;
}

.red-box {
  margin: 0 auto;
  width: 100px;
  height: 100px;
  background: red;
  opacity: 1;
  visibility: visible;
  transition: opacity 5s linear;
}

p {
  text-align: center;
}

JS

代码语言:javascript
运行
复制
new Vue({
  el: "#app",
  data: {
    message: "Hello world"
  }
});

window.setTimeout(function() {
  document.getElementById("app2").removeAttribute("v-cloak");
}, 500);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-14 15:05:28

这不起作用,因为在Vue应用实例初始化之后, div实际上被删除、重新呈现,并变成了一个不同的div,尽管它看起来是一样的。这可能是由于Vue的虚拟DOM机制。

#app2元素在document.getElementById("app2").removeAttribute("v-cloak");https://codepen.io/jacobgoh101/pen/PaKQwV之后仍然是相同的DOM

#app元素是new Vue(...)https://codepen.io/jacobgoh101/pen/ERvojx?editors=0010之后的不同DOM

对于Vue应用程序,删除了带有v-cloak的元素,添加了另一个没有v-cloak的元素。CSS转换没有从“without v-cloak**”“转换到没有** v-cloak**".**的元素,这就是为什么CSS转换不能工作的原因。希望这是足够清楚的。

(如果你还不知道这个,)你可以使用过渡分量

票数 5
EN

Stack Overflow用户

发布于 2018-08-15 21:25:03

正如所解释的,v斗篷不可能发生转换,因为没有v斗篷的DOM元素是一个新元素。

我想出了一个简单的解决办法,使用已挂载方法及其挂钩vm.$nextTick(),在这种情况下,使用v斗篷已经不再必要了。

当最初的app元素替换为Vue生成的新元素时,就会调用挂载,但这并不一定意味着每个子元素都已呈现。当每个子元素都呈现在app视图中时,就会调用nextTick。

首先,我设置了HTML app元素,如下所示:

代码语言:javascript
运行
复制
<div id="main-view" :class="{ready: isPageReady}">...</div>

在我的虚拟应用程序中:

代码语言:javascript
运行
复制
new Vue({
    el: "#main-view",
    data: {
        isPageReady: false, 
    [...]
    mounted: function() {
        this.$nextTick(function () {
            this.isPageReady = true;
        });
    }
});

最后,在CSS中,我尝试了一种使用不透明度的简单方法:

代码语言:javascript
运行
复制
#main-view {
    opacity: 0;
}
#main-view.ready {
    opacity: 1;
    transition: opacity 300ms ease-in-out;
}

注意:如果浏览器的检查器/调试器处于打开状态,则转换并不总是显示。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50859676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档