-
Notifications
You must be signed in to change notification settings - Fork 2.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ListView onEndReached不停调用 #520
Comments
我也碰到这个问题,我的环境是有RefreshControl的时候 ,并且手动设置了ListView的高 |
Can anyone fix this quickly? It's urgent |
ListView 每隔 所以在实际项目里:在 |
这个onEndReached太坑了。。我理解的 :你们判断渲染的DOM长度和datasource里的长度一致时,调用onEndReached函数,是为了预加载一页的数据,但是现在 你预加载一页数据的时候,没有按照pageSize的大小进行渲染,然后就导致渲染的DOM长度和datasource里的长度同时增加,然后就出现了递归调用,而这个递归又没有出口 ,就会导致循环调用onEndReached函数。 |
@warmhug 貌似不能通过Ajax的请求开始和介乎的loading状态来判断吧? |
@jxintang 是的,我也是像你这样理解,并且遇到这样的问题。ajax结束时,loading状态变为false,onEndReached 还是会执行。 并且,refreshControl组合在一起用的时候,下拉刷新清空了列表,同样会触发onEndReached,但这时并不是“onEndReachedThreshold 指定的距离后,继续滑动”. 求解。 |
在onEndReached里面判断一下数据是否已经加载完全,如果没有加载完毕再把isLoading设置为true,就可以了。就是,在设置isLoading为true前加个条件,不要直接写 |
我也碰到了类型的问题,但是我是在下拉刷新的时候出现下拉刷新无法结束的情况,refreshing等于true的时候也无法结束下拉刷新,我们的列表是套用了ant mobile的ListView, RefreshControl组件。数据方面,数据官方demo的写死的数据,我这里通过异步请求的数据 |
@dancinglone 应该是这种情况。个人认为,即使不是fetch获取数据,onEndReached也不应该不停地被调用才对。需要用户自己做个loading标识显得有点生硬。 |
@leonardgithub 嗯,这个需要慢慢完善吧。我更着急现在问题怎样解决呢,有什么idea不,求指点。 我怀疑只是我没有理解清楚一些什么 。这个是比较常规的东西,如果有问题应该好多人会遇到啊。 |
@dancinglone 这个可能会出现,设置下 @35860368 现在 demo 的数据虽然是写死,但已经用 settimeout 模拟 ajax 返回了、基本和真实场景一样。另外 RefreshControl 遇到的问题,建议做个能跑的 demo,放到 GitHub 上我一起看下,可以参考 https://github.com/ant-design/antd-mobile-samples/tree/master/web-webpack 这里做下。 @leonardgithub onEndReached 多次被调用 和 react-native ListView 表现一致,至于这样是否合理正确,也认为有待确认。 |
@warmhug |
@warmhug 参考最新 commit ~ 仍然有不解的地方, 还请指教 ! 场景: ListView 列表 -> 滑动到底部 -> 加载更多 -> 触发 onEndReached 关键代码:
说明:
网络请求关键代码 (dva -> fetch):
回调处理关键代码:
问题: 期待结果: |
@xoptimal 网络异常 回调里,能把 isLoading、loadMore 这些都设为 false 吗? |
@warmhug 每次请求结果, 都会判断是否还有加载更多, 以及设置isLoading 为false , 我目前的做法是为了避免多次请求, 在请求结果上, 做了个延迟的处理, 是失败的情况下, 需要过5秒才可重新请求, 但是这个用户体验感觉并不好 .... 后续的5秒用户只能等待 ~ |
尝试把每页的条数增大一些,请求的数据填充的页面高度少于设定容器的高度会自动触发onEndReached事件 |
请问这个问题解决了没 |
+1 |
@leonardgithub this is not a bug, it's Normal behavior. |
Not a bug? But why so many users encounter this problem? |
My issue was referred by other user, I am not the only user which encounter the problem, please check the 6th point on https://github.com/TerryBeanX2/Webpack-React-Router-Redux-ES6#几点心得 |
If such a problems exists, can the antd-mobile's ListView be used in the production environment? |
使用以下代码似乎能解决不断请求的问题 //hide the toast in a short time delay,otherwise loading toast won't be shown if hidden immediately
hideLoading = (msg) => {
setTimeout(()=>{
Toast.hide();
if (msg) {
Toast.info(msg, 1.5);
}
}, 1000);
};
setNoLoading = (msg) => {
this.hideLoading(msg);
setTimeout(()=>{
this.setState({isLoading: false});
},3000);
};
onReachEnd = (e) => {
console.log('上拉',this.state.isLoading);
if (this.state.isLoading) {
return
}
if (!this.hasMore) {
Toast.info('无更多数据', 1.5);
return;
}
this.setState({isLoading: true});
let last = this.recordData[this.recordData.length - 1];
if (last && last.time) {
Toast.loading('加载中', 10);
Service.traceList('0', last.time).then((response) => {
if (response.code == 1) {
this.setNoLoading();
this.hasMore = response.hasMore || false;
let newL = response.info || [];
this.recordData = this.recordData.concat(newL);
this.setState({
dataSource: this.state.dataSource.cloneWithRows(this.recordData)
});
} else {
this.setNoLoading(response.msg);
}
}, (error) => {
this.setNoLoading();
});
}
}; |
is there anyone who solve this problem? |
In antd-mobile@2.0 , you can use PullToRefersh and react-infinite or your custom infinite-scroll. Irrelevant comments have been deleted. |
关于onEndReached 我的处理是: |
监测滚动的距离
页面渲染完执行滚动到原位置
|
It's too hard!(我太难了) |
本地环境
antd-mobile 版本:├─┬ antd-mobile@0.9.6
操作系统及其版本:Ubuntu 16.04
浏览器及其版本:Chrome Versión 52.0.2743.116 (64-bit)
你做了什么?
引入 antd-mobile 的 ListView, 并上拉
你期待的结果是:
ListView onEndReached使用正常
实际上的结果:
onEndReached不停调用,无法停止
可重现的在线演示
no
The text was updated successfully, but these errors were encountered: