首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在我的vue js中实现无限滚动

如何在我的vue js中实现无限滚动
EN

Stack Overflow用户
提问于 2017-04-04 12:44:01
回答 4查看 19.6K关注 0票数 13

我目前正在学习如何将laravel和vue结合起来。这个页面应该是从服务器获取帖子数据,并在用户时间表中显示。我成功地获取了所有数据并将其显示出来。但是我想实现一个无限的滚动,但是我不知道该怎么做。我已经尝试了许多不同的方法,但也不起作用。也许我对vue的了解还很新鲜。对我有什么建议吗?

这是我的原始代码:jsfiddle

下面是我尝试用这个example实现无限滚动的代码。

jsfiddle 2

滚动符号正在显示,但似乎数组没有通过,数据仍然一次性显示。

一旦提交/feed,服务器将返回包含post信息的数组。但是我不知道如何传入list数组。

返回的数组

在vue中

在路线中

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-04-08 20:33:56

安装:

代码语言:javascript
复制
npm install vue-infinite-scroll --save

在您的main.js中注册:

代码语言:javascript
复制
// register globally
var infiniteScroll =  require('vue-infinite-scroll');
Vue.use(infiniteScroll)

// or for a single instance
var infiniteScroll = require('vue-infinite-scroll');
new Vue({
  directives: {infiniteScroll}
})

你的html:

代码语言:javascript
复制
<div v-infinite-scroll="loadMore" infinite-scroll-disabled="busy" infinite-scroll-distance="10">
  ...
</div>

您的组件:

代码语言:javascript
复制
var count = 0;

new Vue({
  el: '#app',
  data: {
    data: [],
    busy: false
  },
  methods: {
    loadMore: function() {
      this.busy = true;

      setTimeout(() => {
        for (var i = 0, j = 10; i < j; i++) {
          this.data.push({ name: count++ });
        }
        this.busy = false;
      }, 1000);
    }
  }
});
票数 21
EN

Stack Overflow用户

发布于 2017-04-07 17:27:25

一种解决方案是设置一个锁定机制来阻止对后端的快速请求。锁将在发出请求之前启用,然后在请求完成且DOM已使用新内容更新时禁用锁(这将扩展页面的大小)。

例如:

代码语言:javascript
复制
new Vue({
// ... your Vue options.

ready: function () {
var vm = this;
var lock = true;
window.addEventListener('scroll', function () {
  if (endOfPage() && lock) {
    vm.$http.get('/myBackendUrl').then(function(response) {
      vm.myItems.push(response.data);
      lock = false;
    });
  };
});

};});

另一件要记住的事情是,scroll事件被触发的次数超过了您真正需要它的次数(特别是在移动设备上),您可以限制此事件以提高性能。这可以通过requestAnimationFrame有效地完成:

代码语言:javascript
复制
;(function() {
 var throttle = function(type, name, obj) {
    obj = obj || window;
    var running = false;
    var func = function() {
        if (running) { return; }
        running = true;
        requestAnimationFrame(function() {
            obj.dispatchEvent(new CustomEvent(name));
            running = false;
        });
    };
    obj.addEventListener(type, func);
};

/* init - you can init any event */
throttle ("scroll", "optimizedScroll");
})();

// handle event
window.addEventListener("optimizedScroll", function() {
console.log("Resource conscious scroll callback!");
});
票数 2
EN

Stack Overflow用户

发布于 2020-07-11 20:01:03

我也尝试了Vue- in scroll,但它在与Vue-router对齐时不能正常工作,至少在我的代码中是这样。所以我想出了我自己的解决方案。

代码语言:javascript
复制
<template>
  <div ref="loadmore" class="infinite-container">
      <!-- the inifite container -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      timer: null,
      // check if is in infinite procees
      busy: false
    }
  },
  methods: {
    infiniteScrollHandler() {
        //check if container's bttom is overflow screen
      let bottomOff =
        this.$refs.loadmore.getBoundingClientRect().bottom - screen.height;
      if (bottomOff < 10 && !this.busy) {
        console.log("loading... " + new Date());
        this.busy = true;
        // do something 
        this.busy = false;
      }
    },
    setIntervalTimer() {
      //check every 500 milliseconds
      this.timer = setInterval(() => {
        this.infiniteScrollHandler();
      }, 500);
    }
  },
  mounted() {
      // set up timer on mounted
    this.setIntervalTimer();
  },
  beforeDestroy() {
      // do not forget clear the interval timer
    clearInterval(this.timer);
  }
};
</script>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43198442

复制
相关文章

相似问题

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