【问题标题】:Show loading during rendering multiple components in Vue在 Vue 中渲染多个组件时显示加载
【发布时间】:2020-01-04 21:15:15
【问题描述】:

我有一个问题,我根据页面顶部选择的类别加载多个 Vuetify 卡组件。

问题是,如果数组渲染 +50 卡,则加载需要大量时间。我不介意加载时间,但我不喜欢页面在渲染过程中卡住并且我不能使用加载指示器。

我已经尝试在这里模仿这个问题:

https://jsfiddle.net/owa1czqx/2/

<script src="https://unpkg.com/vue"></script>

<div id="app">  
  <button v-for="cat in cats" :key="cat" @click="catSelected(cat)">{{cat}}</button>
  <p v-for="item in items">{{ item }}</p>
</div>

new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue.js!',
    cats: ['cat 1', 'cat 2'],
    items: []
  },
  methods: {
    catSelected(newCat) {
      this.items = []
        for (let i = 0; i <= 50000; i++) {
        this.items.push(i + '. ' + newCat)
      }
    }
  }
})

我想要的是在新卡片呈现之前向用户提供反馈。如果我加载数据,是否可以像我异步获取一样以某种方式异步渲染?

不幸的是,分页或自动滚动加载在我的情况下不是有效的解决方案,因为它会破坏设置的布局。

【问题讨论】:

  • 为什么不使用两个divs,一个用于加载gif,另一个用于app。只需在 mounted 上更改他们的可见性
  • 你能修改 jsfiddle 让它工作吗?如果我使用另一个 div,它就不起作用,因为页面无论如何都会卡在渲染上。需要时间的过程是使所有卡片呈现的过程。
  • 我不确定您是否真的可以绕过浏览器因渲染而忙碌的部分
  • 我能够在开始渲染过程之前显示“正在加载”消息。我显示加载消息,然后使用旧的 setTimeout( () => (//rendering here), 0) 开始渲染。该页面在渲染过程中失去了交互性,但它足以解决我的问题。

标签: javascript vue.js vuetify.js


【解决方案1】:

您可以修改解决方案以显示进度。另外,不要在循环中隐藏loading,完成后立即执行。修改方法在the fiddle:

一个方法通过超时调用loadSet(我不知道为什么$nextTick 不能以同样的方式工作)。

timedLoadSet(newCat, offset, step) { 
  var vm = this;
  setTimeout(function() { vm.loadSet(newCat, offset, step); }, 1);
},

另一个加载东西

loadSet(newCat, offset, step) {
  for (let i = offset; i < offset + step && i < this.count; i++) {
    this.items.push(i + '. ' + newCat);
  }
  this.loaded = Math.round(this.items.length / this.count * 100);

  if(this.items.length === this.count) {
    this.loading = false;
  } else {
    this.timedLoadSet(newCat, offset + step, step);
  }
},

还有一个,启动第一次加载。

catSelected(newCat) {
  this.loading = true;
  this.loaded = 0;
  this.items = [];
  var step = Math.round(this.count / 100);

  this.timedLoadSet(newCat, 0, step);
}

【讨论】:

    【解决方案2】:

    找到了解决方法。这将在呈现所有组件时显示用户加载消息。

    只有一个问题,用户交互在渲染过程中被禁用,但至少给出了正在加载的反馈。

    无论如何,这解决了我的问题,因为我的加载时间约为 0.5-1 秒,如果用户知道正在加载某些内容,这不会打扰用户。

    <script src="https://unpkg.com/vue"></script>
    
    <div id="app">  
      <button v-for="cat in cats" :key="cat" @click="catSelected(cat)">{{cat}}</button>
      <p v-if="loading">Loading...</p>
      <p v-else v-for="item in items">{{ item }}</p>
    </div>
    
    new Vue({
      el: '#app',
      data: {
        message: 'Hello Vue.js!',
        cats: ['cat 1', 'cat 2'],
        items: [],
        loading: false
      },
      methods: {
        catSelected(newCat) {
            const that = this
            that.loading = true
          setTimeout(function() {
            that.items = []
            for (let i = 0; i <= 50000; i++) {
              that.items.push(i + '. ' + newCat)
              that.loading = false
            }
          },0)
        }
      }
    })
    

    https://jsfiddle.net/0k8eyb4m/22/

    【讨论】:

    • 您可以以同样的方式将加载拆分为数千个以获取进度
    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 2019-05-12
    • 2021-03-07
    • 1970-01-01
    • 2020-06-06
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多