vue-infinite-scroll
vue-infinite-scroll copied to clipboard
添加之后,不停地调用加载方法
一直不停地调用加载方法。根本停不下来。。。
this.busy = true;
var _ = this;
$.get('getCollectList',vd,function(res){
if(res.falg == 'success'){
_.content = res.data.content;
_.busy = false;
}
感觉你们做的效果,体验都挺不错,可是我用却老是出问题,忧伤啊
能否提供一个可重现这个问题的用例?
我把主要代码贴出来,可以吗?
入口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}}
就这样,每次请求了之后,就会继续重复请求。只要把busy改为false了之后,就会又执行loadMore方法。
已经解决了。 是因为我把_.busy =false,写到ajax里面去了,我调到外面来就好了。 但是我还是不明白,为什么放在ajax里面,会形成死循环,不停地刷。
busy 是应该在 ajax 结束的时候才重置为 false 的。 能把解决问题的代码贴一下么?
`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外面的时候,只要屏幕动一下,就会直接加载。不管是否到了页面底部。
如果是屏幕动一下就加载,发现即便不在这个页面,在其他页面也会加载,不停的加载。。。
@hubinjie 是否使用了 keep alive 的功能?
@furybean 是的是的,咋破? 我昨天判断了一下$route.name 加了一个return
@hubinjie 可以考虑控制一下 disabled 属性?
@furybean 感觉还是有问题,当你再次进来的时候又加载了,离开又停,再次进来又加载,切进来很卡
如果把这个 directive 写在你要 keep alive 的组件本身呢,这样感觉就只绑定一次?
@hubinjie 使用keep-alive出现了和一样的问题呢
好像跟keep-alive一起使用的确有问题,造成不同的路由页面的滚动条一动都会触发无限加载。。。而且好像不能保存滚动状态
不使用keep-alive切换组件后也是触发无限加载!!
@iversong 这种情况能提供一个 demo 么?
@furybean 我是在动态组件中使用,只是把你们官方例子中的loadMore方法里模拟的异步获取数据替换成ajax请求数据,问题就出现了,明天我贴个demo!
@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 这种情况可以设置 infinite-scroll-immediate-check 为 false。
infinite-scroll-immediate-check 为 false也不行,本来是往下滚动10个像素再加载的,而现在是鼠标只要往上或者往下滚动都加载;感觉这个组件处理ajax异步回调是有bug的
回归本源,实现滚动加载其实没那么复杂,自己写的一个小例,亲测还行,望大家指正:
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();
}
}
});
}
});
确实,不停地调用加载方法 +1 ,按demo走的。跟楼上说的问题一致。
我也遇到 此问题 没人解决吗?
之前使用 vue1.0 配合 vue-infinite-scroll没问题,现在使用vue2.0好像disabled=true也会无限调用方法。
我也遇到了,请问各位大神是怎么解决的?
@lo6041 调用的方法不能有括号
<component v-infinite-scroll="loadMore"></component> ✅
<component v-infinite-scroll="loadMore()"></component> ❎
估计是个bug
猜测应该是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;
};
}
我也遇到这个问题,我把setTimeout时间设置大点就好了,就是图片还没有完全加载完就触发了加载事件的原因,分享一下
我也遇到这个坑爹的问题了
往下拖动后就不断的发请求

可以试试使用infinite-scroll-immediate-check="busy"禁掉自动检查,触发loadMore的时候在开启检查
我也遇到了 大概就是@wengcd说的