加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于React Native中FlatList的onEndReached属性频繁调用的一种解

发布时间:2020-12-15 20:35:16 所属栏目:百科 来源:网络整理
导读:FlatList 组件是RN0.43后引入的组件。作为高性能列表组件, FlatList 在 ListView 的基础上优化了加载性能并简化了渲染过程。不仅如此,该组件还提供了 onRefresh 和 onEndReached 属性,用来定义上拉和下拉的功能。然而笔者发现,当 FlatList 组件的父组件

FlatList组件是RN0.43后引入的组件。作为高性能列表组件,FlatListListView的基础上优化了加载性能并简化了渲染过程。不仅如此,该组件还提供了onRefreshonEndReached属性,用来定义上拉和下拉的功能。然而笔者发现,当FlatList组件的父组件高度不为定值的时候,onEndReached属性调用会出现问题,List并未滑到底部就会被频繁触发,导致功能异常。通常我们会使用Flexbox弹性盒布局,不会给列表组件设置固定widthheight值,因此出现这种问题很可能是FlatList不能够正确的判断是否到达容器底部。

 1 <View style={{flex:1}}>
 2     <FlatList data={this.props.data}
 3         renderItem={({item})=>{
 4         return (<MyItem data={item} clickItem={()=>{
 5                 this.props.getItem(item);
 6             }}/>);
 7         }}
 8         onEndReached{()=>{
 9             this.props.loadMore();
10         }}/>
11 </View>

这种情况下我们可以使用ScrollView的属性手动判断容器底部,因为当我们打开官方关于FlatList组件的介绍(https://facebook.github.io/react-native/docs/flatlist)时,我们发现它继承了ScrollView所有的属性。紧接着,我们找到onScrollonContentSizeChange属性来代替原来的onEndReachedonEndReachedThreshold(IOS)属性。实现如下:

 1 constructor(props){
 2     super(props);
 3     this.state={
 4         loading:false
 5     }
 6 }
 7 --------------------------以下属性添加到FlatList中--------------------------
 8 onScroll={(event)=>{            
 9     let offsetY = event.nativeEvent.contentOffset.y;
10     let contentHeight = event.nativeEvent.contentSize.height;
11     let originHeight = event.nativeEvent.layoutMeasurement.height;
12     if(!this.state.loading){
13         if(offsetY+originHeight+200>=contentHeight){
14             this.setState({
15                 loading:true,16             });
17             this.props.loadMore();
18         }
19     }
20     console.log(this.state.loading+","+offsetY);
21 }}
22 onContentSizeChange={(contentWidth,contentHeight)=>{
23     if(this.state.loading){
24         this.setState({
25             loading:false,26         });
27     }
28 }}

其实现原理是

  1. 滑动时获取屏幕高度、FlatList已在竖轴滑动的数值,以及FlatList内容总高度,以此手动判断当前是否到达底部,到达后设置系统“loading”状态,发送载入请求
  2. 当载入请求发送后,会从网络api获取新数据并添加到FlatList中,从而激活onContentSizeChange中定义的函数,将“loading”状态释放。

ps:本解决方案未考虑数据获取失败情况,有需求可自行在onScroll中添加setTimeout进行延迟释放“loading”状态。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读