vue-infinite-scroll icon indicating copy to clipboard operation
vue-infinite-scroll copied to clipboard

添加之后,不停地调用加载方法

Open skyetang opened this issue 9 years ago • 42 comments

一直不停地调用加载方法。根本停不下来。。。

              this.busy = true;
             var _ = this;
          $.get('getCollectList',vd,function(res){
            if(res.falg == 'success'){
                _.content = res.data.content;
                _.busy = false;
            }

感觉你们做的效果,体验都挺不错,可是我用却老是出问题,忧伤啊

skyetang avatar Jun 07 '16 10:06 skyetang

能否提供一个可重现这个问题的用例?

furybean avatar Jun 07 '16 10:06 furybean

我把主要代码贴出来,可以吗? 入口js import Vue from 'vue'; import mystore from './myStoreIndex'; import infinit from 'vue-infinite-scroll'; Vue.use(infinit) new Vue(mystore);

methods methods: { loadMore: function() { this.busy = true; var _ = this; var vd = {}; $.get('getCollectList',vd,function(res){ _ .content = res.data.content; _.busy = false; }) }

template `

{{data.title}}

{{data.createTime}}
<div class="action" @click="setting">
`

就这样,每次请求了之后,就会继续重复请求。只要把busy改为false了之后,就会又执行loadMore方法。

skyetang avatar Jun 07 '16 11:06 skyetang

已经解决了。 是因为我把_.busy =false,写到ajax里面去了,我调到外面来就好了。 但是我还是不明白,为什么放在ajax里面,会形成死循环,不停地刷。

skyetang avatar Jun 07 '16 14:06 skyetang

busy 是应该在 ajax 结束的时候才重置为 false 的。 能把解决问题的代码贴一下么?

furybean avatar Jun 08 '16 02:06 furybean

`methods: {

loadMore: function() {

this.busy = true;

var _ = this;

var vd = {};

$.get('getCollectList',vd,function(res){ _ .content = res.data.content; _.busy = false; }) }`

1、上面的写法,会不停地刷。。 2、关于然后昨晚上说,把busy重置为false,写在ajax外面的时候,只要屏幕动一下,就会直接加载。不管是否到了页面底部。

skyetang avatar Jun 08 '16 03:06 skyetang

如果是屏幕动一下就加载,发现即便不在这个页面,在其他页面也会加载,不停的加载。。。

hubinjie avatar Jul 18 '16 10:07 hubinjie

@hubinjie 是否使用了 keep alive 的功能?

furybean avatar Jul 18 '16 22:07 furybean

@furybean 是的是的,咋破? 我昨天判断了一下$route.name 加了一个return

hubinjie avatar Jul 19 '16 02:07 hubinjie

@hubinjie 可以考虑控制一下 disabled 属性?

furybean avatar Jul 19 '16 05:07 furybean

@furybean 感觉还是有问题,当你再次进来的时候又加载了,离开又停,再次进来又加载,切进来很卡

hubinjie avatar Jul 20 '16 06:07 hubinjie

如果把这个 directive 写在你要 keep alive 的组件本身呢,这样感觉就只绑定一次?

furybean avatar Jul 20 '16 06:07 furybean

@hubinjie 使用keep-alive出现了和一样的问题呢

weaponready avatar Jul 30 '16 11:07 weaponready

好像跟keep-alive一起使用的确有问题,造成不同的路由页面的滚动条一动都会触发无限加载。。。而且好像不能保存滚动状态

dingyiming avatar Aug 09 '16 07:08 dingyiming

不使用keep-alive切换组件后也是触发无限加载!!

iversong avatar Aug 11 '16 10:08 iversong

@iversong 这种情况能提供一个 demo 么?

furybean avatar Aug 11 '16 10:08 furybean

@furybean 我是在动态组件中使用,只是把你们官方例子中的loadMore方法里模拟的异步获取数据替换成ajax请求数据,问题就出现了,明天我贴个demo!

iversong avatar Aug 11 '16 10:08 iversong

@furybean 我大概找到原因了,当所有数据加载完API返回空的时候,list数组的长度就不会变动触发dom更新,从而重复请求,插件内部是根据高度变化来判断吗,所有数据请求完应该怎么处理,麻烦指教!

    /**
     * 从api获取数据
     */
    loadData() {
      this.loading = true
      this.$http.get('/ajax/user/get_follow',{page: this.pageindex,pagesize:20}).then((response) => {
          if (response.ok) {
            this.onLoadData(response.data)
          }
        }, (response) => {
            // error callback
        });
    },
    /**
     * 接收API获取的数据,并追加到当前列表
     */
    onLoadData(data) {
      this.pageindex++
      let i=0, length=data.length, userItem
      if (length > 0) {
        for(; i<length; i++) {
          userItem = data[i]
          this.list.push(userItem)
        }
      } else {
        this.allLoaded = true
      }
      this.loading = false
    }

iversong avatar Aug 12 '16 07:08 iversong

@iversong 这种情况可以设置 infinite-scroll-immediate-check 为 false。

furybean avatar Aug 12 '16 07:08 furybean

infinite-scroll-immediate-check 为 false也不行,本来是往下滚动10个像素再加载的,而现在是鼠标只要往上或者往下滚动都加载;感觉这个组件处理ajax异步回调是有bug的

jojo-d avatar Oct 13 '16 16:10 jojo-d

回归本源,实现滚动加载其实没那么复杂,自己写的一个小例,亲测还行,望大家指正:

new Vue({
    el: "#vue-app",
    data: function () {
        return {
            busy: false,
        };
    },
    methods: {
        loadMore: function () {
            var _self = this;

            // 或ajax请求
            setTimeout(function () {
                console.log("has loaded");

                _self.busy = false;
            }, 1500)
        }
    },
    ready: function () {
        var _self = this;

        window.addEventListener("scroll", function (e) {
            if (window.scrollY >= document.body.scrollHeight - document.body.clientHeight - 20) {
                if (!_self.busy) {
                    _self.busy = true;

                    _self.loadMore();
                }
            }
        });
    }
});

jojo-d avatar Oct 13 '16 16:10 jojo-d

确实,不停地调用加载方法 +1 ,按demo走的。跟楼上说的问题一致。

xiaoyi-wang avatar Nov 16 '16 12:11 xiaoyi-wang

我也遇到 此问题 没人解决吗?

andylei18 avatar Nov 17 '16 03:11 andylei18

之前使用 vue1.0 配合 vue-infinite-scroll没问题,现在使用vue2.0好像disabled=true也会无限调用方法。

wengcd avatar Dec 22 '16 08:12 wengcd

我也遇到了,请问各位大神是怎么解决的?

lo6041 avatar Mar 06 '17 11:03 lo6041

@lo6041 调用的方法不能有括号

<component v-infinite-scroll="loadMore"></component><component v-infinite-scroll="loadMore()"></component>

估计是个bug

wengcd avatar Mar 08 '17 04:03 wengcd

猜测应该是scroll event触发太快了, 外面套一层debounce,效果要好很多

loadMore: debounce(function(e) {
   do ajax
},500)
export function debounce(func, wait, immediate) {
    var timeout, args, context, timestamp, result;

    var later = function() {
        // 据上一次触发时间间隔
        var last = Date.now() - timestamp;

        // 上次被包装函数被调用时间间隔last小于设定时间间隔wait
        if (last < wait && last > 0) {
            timeout = setTimeout(later, wait - last);
        } else {
            timeout = null;
            // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
            if (!immediate) {
                result = func.apply(context, args);
                if (!timeout) context = args = null;
            }
        }
    };

    return function() {
        context = this;
        args = arguments;
        timestamp = Date.now();
        var callNow = immediate && !timeout;
        // 如果延时不存在,重新设定延时
        if (!timeout) timeout = setTimeout(later, wait);
        if (callNow) {
            result = func.apply(context, args);
            context = args = null;
        }

        return result;
    };
}

leohgbs avatar Apr 10 '17 16:04 leohgbs

我也遇到这个问题,我把setTimeout时间设置大点就好了,就是图片还没有完全加载完就触发了加载事件的原因,分享一下

zhangwei900808 avatar Jun 05 '17 03:06 zhangwei900808

我也遇到这个坑爹的问题了 往下拖动后就不断的发请求 image

xuiwife avatar Nov 26 '18 12:11 xuiwife

可以试试使用infinite-scroll-immediate-check="busy"禁掉自动检查,触发loadMore的时候在开启检查

Satuary avatar Dec 19 '18 09:12 Satuary

我也遇到了 大概就是@wengcd说的

melunar avatar Apr 09 '19 08:04 melunar