React Native FlatList和SectionList列表组件

FlatList

之前使用的组件是ListView,当时要添加一个下拉刷新,上拉加载的功能,所以对ListView做了一些封装,但是后来看官方文档,不建议再使用ListView,因为效率问题,做过Android的朋友都知道,Android的ListView如果不自己处理一下,也是有效率问题的。所以官方又推出了FlatList,而且自带上拉下拉的功能

功能简介

完全跨平台。
支持水平布局模式。
行组件显示或隐藏时可配置回调事件。
支持单独的头部组件。
支持单独的尾部组件。
支持自定义行间分隔线。
支持下拉刷新。
支持上拉加载。
支持跳转到指定行(ScrollToIndex)。
如果需要分组/类/区(section),请使用SectionList

属性介绍

1、data列表数据源

数据格式

class FlatListTest extends Component {
    constructor(props) {
        super(props);
        this.state = {
            taskList: [
                        {taskId:"9",title:"查看营销推广",integral:"50",status:1},
                        {taskId:"10",title:"查看客户管理",integral:"100",status:1},
                        {taskId:"11",title:"查看买车线索",integral:"100",status:1},
                        {taskId:"12",title:"查看全部功能",integral:"200",status:1}
                    ]
        	};
    }
    render() {
    	return (
      		<View style={flatListStyles.container}>
        	   <FlatList
          		data={this.state.taskList}//获取列表数据源
       		   />
      		</View>
   	 );
    }
}
2、renderItem从数据源中逐个解析数据,然后返回一个设定好格式的组件来渲染

简单使用

_renderItem = ({ item, index }) => {
        return (
            <View style={styles.list} key={index}>
                <View style={styles.content}>
                    <Text style={styles.contentTitle}>{item.title}</Text>
                    <Text style={styles.contentTip}>
                        任务奖励<Text style={{ color: "#FF552E" }}>+{item.integral}积分</Text>
                    </Text>
                </View>
                <View style={styles.listBtn}>
                    <Text style={styles.text13FFF}>去完成</Text>
                </View>
            </View>
        );
    };
<FlatList
    renderItem={this._renderItem}//渲染列表
/>

3、ListHeaderComponent添加头部组件

简单使用

_header = () => {
   return (
      <View style={styles.listTitle}>
           <Text style={styles.listTitleText}>任务列表</Text>
      </View>
   );
};
<FlatList
    ListHeaderComponent={this._header} //header头部组件
/>

4、ListFooterComponent属性为FlatList添加尾部组件,接收的参数跟ListHeaderComponent相同

简单使用

_footer = () => (
  <Text style={{fontSize: 14, alignSelf: 'center'}}>到底啦,没有啦!</Text>
)

<FlatList
  ListFooterComponent={this._footer} //添加尾部组件
/>
5、ItemSeparatorComponent属性可以为FlatList列表之间添加分割线
简单使用
//方法声明
_itemSeparator = () => {
    return (
      <View style={{height: 1, backgroundColor: 'skyblue'}}/>
    )
}
//组件调用
<FlatList
  ItemSeparatorComponent={this._itemSeparator}//分割线组件
/>
6、ListEmptyComponent空数据视图
简单使用
_renderEmptyView = () => {
        return (
            <View style={styles.tastListError}>
                <Text style={styles.tastListErrorText}>服务器请求失败</Text>
            </View>
        );
    };

<FlatList
  ListEmptyComponent={this._renderEmptyView}
/>
7、keyExtractor用于为给定的item生成一个不重复的key
Key的作用是使React能够区分同类元素的不同个体,以便在刷新时能够确定其变化的位置,减少重新渲染的开销
若不指定此函数,则默认抽取item.key作为key值。若item.key也不存在,则使用数组下标index
简单使用
_keyExtractor = (item, index) => "index" + index + item;

<FlatList
  keyExtractor={this._keyExtractor}
/>
8、getItemLayout是一个可选的优化,用于避免动态测量内容尺寸的开销
不过前提是你可以提前知道内容的高度。如果你的行高是固定的getItemLayout
用起来就既高效又简单
getItemLayout={(data, index) => ({
  length: 44, offset: (44 + 1) * index, index
})}
注意:如果你指定了SeparatorComponent,请把分隔线的尺寸也考虑到offset的计算之中
设置这一属性,在调用FlatList的跳转函数的时候非常有用,否则可能会很卡顿!如scrollToEnd(),scrollToIndex(),这两个方法后边再说!

9、下拉刷新
FlatList中有两个属性,可以用来设置下拉刷新。
  • refreshing在等待加载新数据时将此属性设为true,列表就会显示出一个正在加载的符号.
  • onRefresh如果设置了此选项,则会在列表头部添加一个标准的RefreshControl控件,以便实现“下拉刷新”的功能。同时你需要正确设置refreshing属性。

简单使用

<FlatList
refreshing={this.state.refreshing}
onRefresh={() => {
  this.setState({refreshing: true})//开始刷新
  //这里模拟请求网络,拿到数据,3s后停止刷新
  setTimeout(() => {
    alert('没有可刷新的内容!');
    this.setState({refreshing: false});//停止刷新
  }, 3000);
}}
/>
10、上拉加载
关于上拉加载,FlatList也封装有两个属性来实现:
  • onEndReachedThreshold:这个属性决定当距离内容最底部还有多远时触发onEndReached回调。需要注意的是此参数是一个比值而非像素单位。比如,0.5表示距离内容最底部的距离为当前列表可见长度的一半时触发。所以它的取值范围为:(0,1),不包含0和1。
  • onEndReached:列表被滚动到距离内容最底部不足onEndReachedThreshold设置的的距离时调用。
简单使用
<FLatList
onEndReachedThreshold={0.1}
onEndReached={({distanceFromEnd}) => (
  setTimeout(() => {
    this.setState((state) => ({
      data: state.data.concat(this._newData),
    }));
  }, 3000)
)}
/>
这里我们设置的距离为列表可见长度的1/10,而触发了onEndReached函数时,我们设置了一个定时器,3s后,将data中的数据添加了新数据,从而达到上拉加载更多的效果

11、其他属性
horizontal:设置为true则变为水平布局模式(默认false)

numColumns:多列布局只能在非水平模式下使用,即必须是horizontal={false}
。此时组件内元素会从左到右从上到下按Z字形排列,类似启用了flexWrap的布局。组件内元素必须是等高的——暂时还无法支持瀑布流布局

columnWrapperStyle:如果设置了多列布局(即将numColumns
值设为大于1的整数),则可以额外指定此样式作用在每行容器上

extraData:如果有除data以外的数据用在列表中(不论是用在renderItem
还是Header或者Footer中),请在此属性中指定。同时此数据在修改时也需要先修改其引用地址(比如先复制到一个新的Object或者数组中),然后再修改其值,否则界面很可能不会刷新

getItem:获取每个Item

getItemCount:获取Item属相

initialNumToRender:指定一开始渲染的元素数量,最好刚刚够填满一个屏幕,这样保证了用最短的时间给用户呈现可见的内容。注意这第一批次渲染的元素不会在滑动过程中被卸载,这样是为了保证用户执行返回顶部的操作时,不需要重新渲染首批元素

initialScrollIndex:指定渲染开始的item index

方法介绍

1、scrollToEnd

滚动到底部。如果不设置getItemLayout属性的话,可能会比较卡

扫描二维码关注公众号,回复: 1333503 查看本文章
2、scrollToIndex
滚动到指定index的item如果不设置getItemLayout属性的话,无法跳转到当前可视区域以外的位置
<FlatList
ref={(flatList) => this._flatList = flatList}
/>

//在点击事件中调用
this._flatList.scrollToEnd();

//viewPosition参数:0表示顶部,0.5表示中部,1表示底部
this._flatList.scrollToIndex({viewPosition: 0, index: this.state.text});

**********************************************************************************************************************************

SectionList

用法和FlatList基本上一样

SectionList高性能的分组(section)列表组件,支持下面这些常用的功能
    完全跨平台。

    支持水平布局模式。

    行组件显示或隐藏时可配置回调事件。

    支持单独的头部组件。

    支持单独的尾部组件。

    支持自定义行间分隔线。

    支持下拉刷新。

    支持上拉加载。

常用属性

sections: Array相当于ListView中的数据源,SectionList所需要的数据都是经由sections属性传入,数据类型为Array类型

renderItem: (info: {item: Item, index: number}) => ?React.Element renderItem返回Section中的每个小的的Item。可以通过函数返回Element,函数有一个info参数,参数为JSON形式,参数形式为:{item: Item, index: number}。

renderSectionHeader: (info: {section: SectionT}) => ?React.Element renderSectionHeader返回每个Section的标志性头部,可以通过函数返回Element,函数有一个info参数,参数为JSON形式,参数形式为:{section:{key : number, data : [ Object, Object, …] }}。

refreshing: boolean 是否处于刷新状态。

onRefresh: () => void 通过函数改变refreshing从而控制刷新与否。

ItemSeparatorComponent : ReactClass item之间的分隔线组件。不会出现在第一行之前和最后一行之后。

SectionSeparatorComponent : ReactClass .每个section之间的分隔组件。

ListHeaderComponent : ReactClass SectionList头部组件。

ListFooterComponent : ReactClass SectionList尾部组件。

keyExtractor: (item: Item, index: number) => string 默认情况下每个item都需要提供一个不重复的key属性,因此可以通过keyExtractor函数为每一个item生成一个唯一的key。

onEndReached : (info: {distanceFromEnd: number}) => void 是否到达底部,在默认情况下会有一个默认的distanceFromEnd临界值。可以通过此属性来达到上拉加载的效果。

onEndReachedThreshold number 调用onEndReached之前的临界值,单位是像素












猜你喜欢

转载自blog.csdn.net/gongch0604/article/details/80075813