【问题标题】:websocket + vuejs: screen flickering, visible mustache codewebsocket + vuejs:屏幕闪烁,可见胡子代码
【发布时间】:2015-06-12 19:20:21
【问题描述】:

我使用 websockets 和 vuejs 构建了一个网络应用程序。

在 DOM 中,我想遍历 vuejs 处理的数据。然而,在建立 websocket 连接并接收到数据之后,数据会在时间轴中稍后设置。

到那时(大约 0.5 秒),您可以在网站本身上看到 vuejs 的小胡子代码,然后看到它闪烁并添加真实数据。

我创建 ViewModel,当从 websocket 连接接收数据时,像这样:

onMessage: function (e) {
    new Vue({
        el: '#messages',
        data: {
            messages: e.data
        }
    });
}

我已经尝试过在页面加载时初始化 ViewModel,然后再设置数据:

var vms = {
    messages: new Vue({
        el: '#messages',
        data: {
            messages: {
            }
        }
    })
};

在websocket的onMessage事件中:

var vm = vms.messages;
vm.$data = { messages: body };

但问题是,在虚拟机初始化之前仍有延迟。顺序是这样的:

页面加载 -> 可见的小胡子代码 -> 小胡子代码被隐藏,因为数据被设置为一个空对象 -> 真实数据在被 websocket 接收后显示

关于这个问题的任何想法/最佳实践?

【问题讨论】:

  • 使用 mustache 设置类名,在 CSS 中隐藏除该类名之外的所有内容。 CSS 不会碰到未插值的占位符,当它变成真正的 css 类时,它将不再被隐藏。

标签: javascript websocket vue.js


【解决方案1】:

在阅读 api 文档之前,我遇到了同样的问题。 这是v-cloak directives的链接!

HTML:

<div id="demo" v-cloak><p>{{ test }}</p></div>

CSS:

[v-cloak] {display: none}

【讨论】:

  • 对不起,我没有注意到 jel 已经发布了正确的解决方案:)
  • 没遇到过这个问题,但是小胡子标签总是不可见不是很普遍吗?如果是这样,为什么v-cloak 不是默认值?我知道这个答案来自 1 多年前,但只是把它扔在那里。
【解决方案2】:

根据 dandavis 的评论,我向 DOM 添加了一个“隐藏”类 (display: none),并添加了 v-class="hidden: !done",以切换 DOM 的可见性。 done是ViewModel数据中的键值对。

HTML:

<div class="message hidden" v-repeat="messages" v-class="hidden: !done">...</div>

Javascript:

onMessage: function (e) {
    new Vue({
        el: '#messages',
        data: {
            messages: e.data,
            done: true
        }
    });
}

【讨论】:

  • 不确定是否会覆盖隐藏的 CSS 类。更好的解决方案是使用 v-cloak(显示:无)和 v-show="done",而不是切换 css 类。
  • 在摆弄了 v-show 之后,我选择了 v-cloak。首先在你的 CSS 中设置 [v-cloak] { display: none } 的规则。然后将 v-cloak 添加到您想要隐藏的任何元素,直到加载 vm。 vuejs.org/api/directives.html#v-cloak
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2015-11-05
  • 2014-11-29
相关资源
最近更新 更多