史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

简介: React Native系列 《逻辑性最强的React Native环境搭建与调试》  《ReactNative开发工具有这一篇足矣》  《解决React Native unable to load script from assets index.

 React Native系列

《逻辑性最强的React Native环境搭建与调试》 

《ReactNative开发工具有这一篇足矣》 

《解决React Native unable to load script from assets index.android.bundle on windows》 

《React Native App设置&Android版发布》

《史上最易懂——ReactNative分组列表SectionList使用详情及示例详解》


 

目录

1、SectionList简述
2、SectionList常用属性和方法
3、SectionList示例,通讯录实现以及源码

正文

1、SectionList简述

ReactNative长列表数据组件一共有三个:
  ListView 核心组件,数据量大时性能较差,占用内存持续增加,故设计出来FlatList组件。
  FlatList 用于替代ListView,支持下拉刷新和上拉加载。
  SectionList 高性能的分组列表组件。
本文重点介绍SectionList,SectionList支持下面的常用功能:
  完全跨平台
  支持水平布局模式
  行组件显示或隐藏时可配置回调事件
  支持单独的头部组件
  支持单独的尾部组件
  支持自定义行间分隔线
  支持下拉刷新
  支持上拉加载

 

2、SectionList常用属性和方法

属性集合

属性名

类型

说明

sections

Array

数据源

ItemSeparatorComponent

ReactClass<any>

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

SectionSeparatorComponent 

ReactClass<any>

每个section之间的分隔组件

ListEmptyComponent ReactClass<any> | React.Element<any>

列表为空时渲染该组件。可以是React Component, 也可以是一个render函数, 或者渲染好的element。

ListFooterComponent

ReactClass<any>

尾部组件

ListHeaderComponent

ReactClass<any>

头部组件

data

Array<ItemT>

为了简化起见,data属性目前只支持普通数组。如果需要使用其他特殊数据结构,例如immutable数组,请直接使用更底层的VirtualizedList组件

extraData

any

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

getItem

any

获取控件的绑定数据

getItemCount

any

获取绑定数据的条数

getItemLayout

(data: ?Array<ItemT>, index: number) => {length: number, offset: number, index: number}

getItemLayout是一个可选的优化,用于避免动态测量内容尺寸的开销,不过前提是你可以提前知道内容的高度。如果你的行高是固定的,getItemLayout用起来就既高效又简单,类似下面这样:

getItemLayout={(data, index={length: 行高, offset: 行高 * index, index)}

注意如果你指定了SeparatorComponent,请把分隔线的尺寸也考虑到offset的计算之中。

initialNumToRender

number 

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

keyExtractor

(item: ItemT, index: number) => string

此函数用于为给定的item生成一个不重复的key。Key的作用是使React能够区分同类元素的不同个体,以便在刷新时能够确定其变化的位置,减少重新渲染的开销。若不指定此函数,则默认抽取item.key作为key值。若item.key也不存在,则使用数组下标。

legacyImplementation

boolean 

设置为true则使用旧的ListView的实现

onEndReached

(info: {distanceFromEnd: number}) => void

当列表被滚动到距离内容最底部不足onEndReachedThreshold的距离时调用

onEndReachedThreshold

number 

决定当距离内容最底部还有多远时触发onEndReached回调。注意此参数是一个比值而非像素单位。比如,0.5表示距离内容最底部的距离为当前列表可见长度的一半时触发

onRefresh

void

如果设置了此选项,则会在列表头部添加一个标准的RefreshControl控件,以便实现“下拉刷新”的功能。同时你需要正确设置refreshing属性

onViewableItemsChanged

(info: {viewableItems: Array<ViewToken>, changed: Array<ViewToken>}) => void

在可见行元素变化时调用。可见范围和变化频率等参数的配置请设置viewabilityconfig属性

refreshing

boolean 

在等待加载新数据时将此属性设为true,列表就会显示出一个正在加载的符号

renderItem

(info: {item: ItemT, index: number}) => ?React.Element<any>

根据行数据data渲染每一行的组件

viewabilityConfig

ViewabilityConfig 

请参考ViewabilityHelper的源码来了解具体的配置

方法集合:

方法名 说明

scrollToLocation

将可视区内位于特定sectionIndex 或 itemIndex (section内)位置的列表项,滚动到可视区的制定位置。比如说,viewPosition 为0时将这个列表项滚动到可视区顶部 (可能会被顶部粘接的header覆盖), 为1时将它滚动到可视区底部, 为0.5时将它滚动到可视区中央。viewOffset是一个以像素为单位,到最终位置偏移距离的固定值,比如为了弥补粘接的header所占据的空间

注意: 如果没有设置getItemLayout,就不能滚动到位于外部渲染区的位置。

recordInteraction

主动通知列表发生了一个事件,以使列表重新计算可视区域。比如说当waitForInteractions 为 true 并且用户没有滚动列表时,就可以调用这个方法。不过一般来说,当用户点击了一个列表项,或发生了一个导航动作时,我们就可以调用这个方法。

flashScrollIndicators

短暂地显示滚动指示器。

3、SectionList示例,通讯录实现以及源码

 

源码:

import React, { Component } from 'react';
import {
  AppRegistry,
  View,
  Text,
  SectionList,
} from 'react-native';



class HomeScreen extends React.Component {

  constructor(props) {
    super(props);
  }

  _renderItem = (info) => {
    var txt = '  ' + info.item.title;
    return <Text
      style={{ height: 60, textAlignVertical: 'center', backgroundColor: "#ffffff", color: '#5C5C5C', fontSize: 15 }}>{txt}</Text>
  }

  _sectionComp = (info) => {
    var txt = info.section.key;
    return <Text
      style={{ height: 50, textAlign: 'center', textAlignVertical: 'center', backgroundColor: '#9CEBBC', color: 'white', fontSize: 30 }}>{txt}</Text>
  }

  render() {
    var sections = [
      { key: "A", data: [{ title: "阿童木" }, { title: "阿玛尼" }, { title: "爱多多" }] },
      { key: "B", data: [{ title: "表哥" }, { title: "贝贝" }, { title: "表弟" }, { title: "表姐" }, { title: "表叔" }] },
      { key: "C", data: [{ title: "成吉思汗" }, { title: "超市快递" }] },
      { key: "W", data: [{ title: "王磊" }, { title: "王者荣耀" }, { title: "往事不能回味" },{ title: "王小磊" }, { title: "王中磊" }, { title: "王大磊" }] },
    ];

    return (
      <View style={{ flex: 1 }}>
        <SectionList
          renderSectionHeader={this._sectionComp}
          renderItem={this._renderItem}
          sections={sections}
          ItemSeparatorComponent={() => <View><Text></Text></View>}
          ListHeaderComponent={() => <View style={{ backgroundColor: '#25B960', alignItems: 'center', height: 30 }}><Text style={{ fontSize: 18, color: '#ffffff' }}>通讯录</Text></View>}
          ListFooterComponent={() => <View style={{ backgroundColor: '#25B960', alignItems: 'center', height: 30 }}><Text style={{ fontSize: 18, color: '#ffffff' }}>通讯录尾部</Text></View>}
        />
      </View>
    );
  }

}

AppRegistry.registerComponent('App', () => HomeScreen);

附源码github地址:https://github.com/vipstone/react-nation-sectionlist

 

小技巧:如何隐藏header?

static navigationOptions = {
  header: null
};

设置header为null即可隐藏。

 

img_fa0be433d68c8212b2b0b3b1a564ccb1.png
如果本文对你有所帮助,请打赏——1元就足够感动我:)
支付宝打赏 微信打赏
联系邮箱:intdb@qq.com
我的GitHub: https://github.com/vipstone
关注公众号: img_9bde0f31ac4a0eca10b1bd7414b78faf.png


作者: 王磊
出处: http://vipstone.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,请标明出处。

相关文章
|
存储 Prometheus 监控
程序开发中的监控和日志分析
监控和日志分析在软件开发中至关重要,它们帮助实时了解应用状态、及时发现并解决问题。监控确保系统稳定运行,优化性能和资源;日志分析则助于追踪问题根源、监测用户行为并提供安全审计。利用如Prometheus、ELK Stack等工具可实现高效监控与日志管理,从而优化应用性能和用户体验。
400 2
|
10月前
|
存储 负载均衡 Java
如何配置Windows主机MPIO多路径访问存储系统
Windows主机多路径(MPIO)是一种技术,用于在客户端计算机上配置多个路径到存储设备,以提高数据访问的可靠性和性能。本文以Windows2012 R2版本为例介绍如何在客户端主机和存储系统配置多路径访问。
585 13
如何配置Windows主机MPIO多路径访问存储系统
|
10月前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
477 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
监控 Linux Shell
"揭秘!一键掌控Linux服务器健康的秘密武器——超实用系统检查脚本,让你的服务器稳如老狗,告别宕机烦恼!"
【8月更文挑战第14天】服务器宕机或资源耗尽会严重影响业务。为此,你需要一个Linux系统检查脚本来守护服务器健康。它可以自动检测潜在问题如磁盘满载、内存泄漏等,避免服务中断。脚本应包括磁盘空间、内存/CPU使用、系统时间准确性、关键服务状态及系统日志分析等检查项。通过编写并定期运行这样的脚本,可以显著提高服务器的稳定性和可靠性。
184 1
|
安全 Ubuntu Linux
Linux 文件传输利器:SCP 和 LRZSZ
**摘要:** 本文介绍了Linux下安全的文件传输工具`scp`和`lrzsz`。`scp`基于SSH,用于安全地在本地和远程主机间拷贝文件或目录,例如`scp user@host:file local_path`或`scp local_file user@host:remote_path`。`lrzsz`包含`rz`(上传)和`sz`(下载)命令,通过SSH连接传输文件,安装后在终端中使用`rz`选择本地文件上传,用`sz file`下载远程文件。注意`scp`需正确权限,`lrzsz`需SSH客户端支持ZModem。这两个工具为跨平台文件传输提供了便利。
263 2
|
C语言
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
【C语言基础篇】字符串处理函数(二)strcpy的介绍及模拟实现
|
NoSQL 关系型数据库 MySQL
[AIGC] 分布式锁及其实现方式详解与Python代码示例
[AIGC] 分布式锁及其实现方式详解与Python代码示例
370 1
|
缓存 负载均衡 算法
【Nginx】Nginx 负载均衡
【1月更文挑战第25天】【Nginx】Nginx 负载均衡
|
Shell 开发工具 git
git 上传文件到gitlab
git 上传文件到gitlab
717 0
git 上传文件到gitlab
|
文字识别 算法 计算机视觉
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV图像处理
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV图像处理
387 1