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

 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即可隐藏。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat 系统服务 outofmemory

TOMCAT内存溢出outofmemory的问题&#xff1a; http://hi.baidu.com/mefeng47/item/3b247af74ce4e24e922af2e5 注&#xff1a;双击tomcat6w.exe打开tomcat monitor 1.OutOfMemoryError: Java heap space 堆溢出 VM参数&#xff1a;-Xms256m -Xmx512m 2.OutOfMemoryError: PermG…

Jeston TX2安装Ubuntu系统

准备材料&#xff1a;一台装有Ubuntu系统的电脑&#xff0c;联网的路由器&#xff0c;网线&#xff08;这里用了两根&#xff09;&#xff0c;一根普通安卓手机充电线 我的电脑系统是Ubuntu16.04&#xff0c;尝试了在Ubuntu18.01上面运行下面的命令&#xff0c;不能运行&#x…

VS2010 error C299: “Font”:“struct”类型重定义

在VS2010里添加了在VC6.0里形成的OFFICE库文件的类 excel9.h,excel9.cpp&#xff0c;就是我在VC6里做操作OFFICE的表格时候添加的库文件&#xff0c;然后把它们&#xff08; excel9.h,excel9.cpp&#xff09;加载VS2010里&#xff0c;然后就报很多的错误。下面的错误只是一部分…

ReactNative环境搭建扩展篇——安装后报错解决方案

之前一篇写了《逻辑性最强的React Native环境搭建与调试》说了RN的安装&#xff0c;今天在这里做一个复盘&#xff0c;让我们能够更直观更深入的了解React Native&#xff08;以下简称RN&#xff09;,这一篇重点来说的就是&#xff0c;安装之后必报的2个错误的解决方案。 更新…

TensorFlow实战——深度学习训练个性化推荐系统

请安装TensorFlow1.0&#xff0c;Python3.5 项目地址&#xff1a;GitHub - xiaobingchan/movie_recommender: MovieLens based recommender system.使用MovieLens数据集训练的电影推荐系统。 前言 本项目使用文本卷积神经网络&#xff0c;并使用MovieLens数据集完成电影推荐的…

Ubuntu开发环境配置--- 安装chrome浏览器

Ubuntu开发环境配置--- 安装chrome浏览器 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/idomyway/article/details/81986062 前言 Ubantu中自带了…

java中的匿名内部类总结

匿名内部类也就是没有名字的内部类正因为没有名字&#xff0c;所以匿名内部类只能使用一次&#xff0c;它通常用来简化代码编写但使用匿名内部类还有个前提条件&#xff1a;必须继承一个父类或实现一个接口实例1:不使用匿名内部类来实现抽象方法12345678910111213141516abstrac…

Xamarin使用ListView开启分组视图Cell数据展示bug处理

问题描述 Xamarin使用IsGroupingEnabled"true"之后再Cell操作就会出现数据展示bug&#xff0c;数据不刷新的问题&#xff0c;如下图所示&#xff1a; 点击取消的是其他钢厂&#xff0c;但ViewCell展示的一直是“长峰”&#xff0c;这就分组试图一个比较常见的bug。 …

YOLOv3实现鱼类目标检测

YOLOv3实现鱼类目标检测 我将以一个项目实例&#xff0c;记录如何用YOLOv3训练自己的数据集。 在开始之前&#xff0c;首先了解一下YOLO系列代表性的DarkNet网络。 如下图所示&#xff0c;是YOLOv3中使用的DarkNet-53的结构&#xff0c;几种核心结构是&#xff1a; DBL: 是…

Xamarin截取/删除emoji表情bug解决方案

大家都知道&#xff0c;一个英文1字节&#xff0c;一个汉字2字节&#xff0c;而一个emoji表情4个字节&#xff0c;在有这三种混用的时候&#xff0c;比如app聊天界面&#xff0c;那么删除和截取便成了很头痛的事情。 问题描述 截取导致乱码&#xff0c;如下图&#xff1a; 解…

Web前端开发工程师必读de设计博客

2019独角兽企业重金招聘Python工程师标准>>> Web设计是一个不断变化的领域&#xff0c;因此掌握最新的发展趋势及技术动向对设计师来说非常重要&#xff0c;无论是学习新技术&#xff0c;还是寻找免费资源与工具&#xff0c;设计博客都是很不错的去处。本文向Web前端…

Qt QtCreator 所有版本官方下载地址

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/xiezhongyuan07/article/details/79246556 直接跳过输入账号&#xff0c;选择所需版本。废话不多说&…

Tensorflow 神经网络作业手写数字识别 训练、回测准确率

大白话讲解卷积神经网络工作原理&#xff0c;推荐一个bilibili的讲卷积神经网络的视频&#xff0c;up主从youtube搬运过来&#xff0c;用中文讲了一遍。 这篇文章是 TensorFlow 2.0 Tutorial 入门教程的第五篇文章&#xff0c;介绍如何使用卷积神经网络&#xff08;Convolutio…

React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)

React Native&#xff08;以下简称RN&#xff09;绑定微信分享/微信登录/微信支付的实现演示源码注意事项&#xff01;微信的调用大同小异&#xff0c;本文实现了微信的分享功能&#xff0c;其他功能可以在链接文档里面找到具体的方法。 本文分文三个部分&#xff1a;一、效果…

open×××+Mysql+PAM构建强大的***系统

openMysqlPAM构建强大的***系统本次为新的生产环境部署系统而采用了这个方案&#xff0c;陆续会将实际的生产架构整理出来.由于涉及到公司的各种敏感信息&#xff0c;已经将IP做了替换中途可能有出入 敬请谅解。等我找时间画图出来一并奉上。如果有根本上的问题&#xff0c;请大…

Linux 下 Qt 5.12无法切换中文输入法

无法切换中文输入的原因是当前下载的QtCreator中没有适配当前输入法框架&#xff08;ibus、fcitx&#xff09;的动态库 解决方法&#xff1a; 一、安装对应的输入法插件 1、如果是fcitx&#xff1a; ubuntu18.04&#xff1a;sudo apt-get install libfcitx-qt5-dev 拷贝系统路…

微信中通过页面(H5)直接打开本地app的解决方案

简述 微信中通过页面直接打开app分为安卓版和IOS版&#xff0c;两个的实现方式是完全不同的。 安卓版实现&#xff1a;使用腾讯的应用宝&#xff0c;只要配置了“微下载”之后&#xff0c;打开链接腾讯会帮你判断本地是否已经安装了app&#xff0c;如果本地安装就直接打开&am…

GIMP 基本教程

本文主要记录笔者使用GIMP的心得&#xff0c;有些具体操作内容会省略&#xff0c;读者可以酌情阅读&#xff0c;内容较多&#xff0c;建议通过右边目录查看。 GIMP 是高级图片编辑器。 您可以使用它来编辑,增强和修饰照片 和扫描,创建工程图以及制作自己的图像。 它具有大量的专…

iOS通用链接(Universal Links)突然点击无效的解决方案

接上文《微信中通过页面(H5)直接打开本地app的解决方案》已经把iOS搞定并且已经正常能跑了&#xff0c;突然就再也用不了了... 问题描述 测试告诉我&#xff0c;如果从微信打开App之后&#xff0c;点击App右上角的应用网址之后&#xff0c;iOS通用链接就费了&#xff0c;在也…

如何利用shell脚本和client-go实现自己的k8s调度器

调度器介绍 scheduler 是k8s master的一部分&#xff0c;作为插件存在于k8s生态体系。 自定义调度器方式 添加功能重新编译实现自己的调度器&#xff08;multi-scheduler&#xff09;scheduler调用扩展程序实现最终调度&#xff08;Kubernetes scheduler extender&#xff09…