【问题标题】:vue large lists with autoscroll带有自动滚动功能的 vue 大列表
【发布时间】:2018-05-20 11:00:11
【问题描述】:

我想在我的页面上有一个自动滚动日志。日志从 REST 端点动态轮询。现在的问题是这个日志会变得非常大,所以我使用vue-virtual-scroll-list 来显示日志。我还希望日志自动滚动到底部,除非我向上滚动时要保持滚动位置。为此,我使用了vue-chat-scroll。现在的问题是日志滚动在开始时工作正常,但在几百个条目后滚动条完全混乱,不再匹配内容,也不会自动滚动到底部。我写的vue组件是这样的:

Vue.component('log', {
  data: function() {
    return { msgs: [] }
  },

  props: {
    id: { type: String, required: true },
    length: { type: Number, required: true },
    refreshRate: { type: Number, default: 1000 }
  },

  template: 
      '<virtual-list :size="40" :remain="length" class="list-unstyled" :ref="id" v-chat-scroll="{always: false}">\
        <li v-for="msg in msgs" :key="msg.id" :class="logColor(msg.severity)">\
          <pre>[{{ shortTimestamp(msg.timestamp) }}]: {{ msg.message }}</pre>\
        </li>\
      </virtual-list>',

  methods: {
    fetchLogs: function(){
      var session = this.id;
      var start = -this.length;
      if (this.msgs.length > 0)
        start = this.msgs[this.msgs.length - 1].id;

      var vue = this;
      $.post(getUrl("/sessions/" + session + "/log"), JSON.stringify({
        start: start
      })).then(function(data) {
        for(var msg of data){
          vue.msgs.push(msg);
        }
      });
    },

    shortTimestamp: function(time) {
      var fulldate = new Date(time);
      return fulldate.toLocaleTimeString();
    },

    logColor: function(severity) {
      switch (severity) {
        case "Trace":
          return "list-group-item-light";
        case "Debug":
          return "list-group-item-dark";
        case "Information":
          return "list-group-item-info";
        case "Notice":
          return "list-group-item-primary";
        case "Warning":
          return "list-group-item-warning";
        case "Error":
          return "list-group-item-danger";
        case "Critical":
          return "list-group-item-danger";
        case "Fatal":
          return "list-group-item-danger";
      }
    }
  },

  mounted: function() {
    setInterval(function () {
      this.fetchLogs();
    }.bind(this), this.refreshRate); 
  }
})

有没有办法解决这个问题?

【问题讨论】:

    标签: javascript vue.js vuejs2


    【解决方案1】:

    我认为使用Vuescroll 可能会解决您的问题。

    • 首先,Vuescroll 有handle-resize 事件,可以帮助你检测内容的大小变化并对你做出反应。
    • 其次,Vuescroll 有scrollTo Api,可以帮助你滚动到页面的任意位置。
    • 最后,但是如何解决数据过多的问题? OK,您可以根据自己的需要,通过监听handle-scroll事件手动定制数据数组。

    【讨论】:

    • 你可能忘了提到 vuescroll 的文档非常很差(github上的问题主要是中文或日文),并且他们提供的默认css仅适用于铬合金。他们的演示页面使用自定义 css,在任何地方都没有记录。另外,我认为您自己的 css 规则会影响插件的行为方式(我在每个浏览器中得到不同的结果),这当然没有记录。
    • 只有 Chrome,你在开玩笑吗?也许您正在使用原始版本的 Vuescroll。现在,vuescroll 已经兼容 vue 支持的几乎所有浏览器。见github.com/YvesCoding/vuescroll/issues/52。 “问题主要是中国人和日本人” - 你确定吗?一共42期,中文版只有19期。也许你评论了都没看!
    • 仅计算中文标题,我得到21/42,而英文标题的一些问题实际上包含中文。 > 50% = 主要是。无论哪种方式,我都承认这是一个咆哮,因为花了 2 个小时左右试图找到合适的自定义卷轴。是的 - 提供的默认 css 使用非标准 ::-webkit-scrollbar 伪元素,它仅适用于 webkit 浏览器。
    • 你不知道隐藏原生栏的方法。我们使用 ::webkit-scroll 来隐藏移动滚动条或其他没有滚动条装订线的浏览器。但是对于像 Chrome 或 firefox 这样的大多数浏览器,我们使用 margin-right: -gutterpx 和 height: (100% + gutterpx) 来隐藏垂直滚动条和水平滚动条,这不仅可以在 webkit 浏览器上工作,也可以在其他浏览器上工作。关于问题的一些事情我认为并不重要,因为我是中国人,在中国有更多的晋升机会,而中国问题并不比英文问题多。
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多