目录

1.ScrollView

1.1ScrollView介绍

1.2ScrollView常用属性

1.3ScrollView常用方法

1.4. 获取原生事件

2.FlatList

2.1FlatList介绍

2.2FlatList常用属性

2.3FlatList常用方法

2.4FlatList示例

2.4.1示例

2.4.2.FlatList添加头部和尾部组件

2.4.3.FlatList下拉刷新

2.4.4.FlatList自动加载下一页

2.4.5.FlatList分割线


ScrollView和FlatList应该如何选择?

ScrollView和FlatList应该如何选择?ScrollView会简单粗暴地把所有子元素一次性全部渲染出来。其原理浅显易懂,使用上自然也最简单。然而这样简单的渲染逻辑自然带来了性能上的不足。想象一下你有一个特别长的列表需要显示,可能有好几屏的高度。创建和渲染那些屏幕以外的JS组件和原生视图,显然对于渲染性能和内存占用都是一种极大的拖累和浪费。

这就是为什么我们还有专门的FlatList组件。FlatList会惰性渲染子元素,只在它们将要出现在屏幕中时开始渲染。这种惰性渲染逻辑要复杂很多,因而API在使用上也更为繁琐。除非你要渲染的数据特别少,否则你都应该尽量使用FlatList,哪怕它们用起来更麻烦。

此外FlatList还可以方便地渲染行间分隔线,支持多列布局,无限滚动加载等等。

1.ScrollView

1.1ScrollView介绍

a.一个封装了平台的ScrollView(滚动视图)的组件,同时还集成了触摸锁定的“响应者”系统。

b.ScrollView必须有一个确定的高度才能正常工作,因为它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作)。

c.要给ScrollView一个确定的高度的话,要么直接给它设置高度(不建议),要么确定所有的父容器都有确定的高度。一般来说我们会给ScrollView设置flex:1以使其自动填充父容器的空余空间,但前提条件是所有的父容器本身也设置了flex或者指定了高度,否则就会导致无法正常滚动,你可以使用元素查看器来查找具体哪一层高度不正确。

1.2ScrollView常用属性

horizontal bool
当此属性为true的时候,所有的子视图会在水平方向上排成一行,而不是默认的在垂直方向上排成一列。默认值为false。keyboardDismissMode enum('none', 'on-drag', 'interactive')
用户拖拽滚动视图的时候,是否要隐藏软键盘。
跨平台可用的值
'none' (默认值),拖拽时不隐藏软键盘。
'on-drag',当拖拽开始的时候隐藏软键盘。
仅iOS可用的值
'interactive',软键盘伴随拖拽操作同步地消失,并且如果往上滑动会恢复键盘。安卓设备上不支持这个选项,会表现的和none一样。pagingEnabled bool
当值为true时,滚动条会停在滚动视图的尺寸的整数倍位置。这个可以用在水平分页上。默认值为false。
注意:垂直分页在Android上不支持。refreshControl element
指定RefreshControl组件,用于为ScrollView提供下拉刷新功能。只能用于垂直视图,即horizontal不能为true。scrollEnabled bool
当值为false的时候,内容不能滚动,默认值为true。
注意即便禁止用户滚动,你也仍然可以调用scrollTo来滚动。showsHorizontalScrollIndicator bool
当此属性为true的时候,显示一个水平方向的滚动条。showsVerticalScrollIndicator
当此属性为true的时候,显示一个垂直方向的滚动条。stickyHeaderIndices array of number
一个子视图下标的数组,用于决定哪些成员会在滚动之后固定在屏幕顶端。举个例子,传递stickyHeaderIndices={[0]}会让第一个成员固定在滚动视图顶端。这个属性不能和horizontal={true}一起使用。endFillColor color
有时候滚动视图会占据比实际内容更多的空间。这种情况下可以使用此属性,指定以某种颜色来填充多余的空间,以避免设置背景和创建不必要的绘制开销。一般情况下并不需要这种高级优化技巧。(android)overScrollMode enum('auto', 'always', 'never')
覆盖默认的overScroll模式
可选的值有:
'auto' - 默认值,允许用户在内容超出视图高度之后可以滚动视图。
'always' - 无论内容尺寸,用户始终可以滚动视图。
'never' - 始终不允许用户滚动视图。alwaysBounceHorizontal
当此属性为true时,水平方向即使内容比滚动视图本身还要小,也可以弹性地拉动一截。当horizontal={true}时默认值为true,否则为false。(iOS)automaticallyAdjustContentInsets bool
当滚动视图放在一个导航条或者工具条后面的时候,iOS系统是否要自动调整内容的范围。默认值为true。(译注:如果你的ScrollView或FlatList的头部出现莫名其妙的空白,尝试将此属性置为false)(iOS)bounces bool
当值为true时,如果内容范围比滚动视图本身大,在到达内容末尾的时候,可以弹性地拉动一截。如果为false,尾部的所有弹性都会被禁用,即使alwaysBounce属性为true。默认值为true。(iOS) bouncesZoom bool
当值为true时,使用手势缩放内容可以超过min/max的限制,然后在手指抬起之后弹回min/max的缩放比例。否则的话,缩放不能超过限制。canCancelContentTouches bool
当值为false时,一旦有子节点响应触摸操作,即使手指开始移动也不会拖动滚动视图。默认值为true(在以上情况下可以拖动滚动视图)。(iOS)contentInset object: {top: number, left: number, bottom: number, right: number}
内容范围相对滚动视图边缘的坐标。默认为{top: 0, left: 0, bottom: 0, right: 0}。(iOS)contentOffset PointPropType
用来手动设置初始的滚动坐标。默认值为{x: 0, y: 0}。(ios)indicatorStyle enum('default', 'black', 'white')
设置滚动条的样式。
'default' 默认值,等同black。
'black',黑色滚动条。
'white',白色滚动条。(iOS)maximumZoomScale number
允许的最大缩放比例。默认值为1.0。(iOS)minimumZoomScale number
允许的最小缩放比例。默认值为1.0。(iOS)pinchGestureEnabled bool
设置为true时,ScrollView会允许用户使用双指缩放操作。默认值为true。(iOS)scrollEventThrottle number
这个属性控制在滚动过程中,scroll事件被调用的频率(单位是每秒事件数量)。更小的数值能够更及时的跟踪滚动位置,不过可能会带来性能问题,因为更多的信息会通过bridge传递。由于JS事件循环需要和屏幕刷新率同步,因此设置1-16之间的数值不会有实质区别。默认值为0,意味着每次视图被滚动,scroll事件只会被调用一次。(iOS)scrollIndicatorInsets object: {top: number, left: number, bottom: number, right: number}
决定滚动条距离视图边缘的坐标。这个值应该和contentInset一样。默认值为{0, 0, 0, 0}。(iOS)scrollsToTop bool
当此值为true时,点击状态栏的时候视图会滚动到顶部。默认值为true。(iOS) zoomScale number
滚动视图内容当前的缩放比例。默认值为1.0。

1.3ScrollView常用方法

onScrollBeginDrag={this._onScrollBeginDrag}
当用户开始拖动此视图时调用此函数。onScrollEndDrag={this._onScrollEndDrag}
当用户停止拖动此视图时调用此函数。onMomentumScrollBegin={this._onMomentumScrollBegin}
滚动动画开始时调用此函数。onMomentumScrollEnd={this._onMomentumScrollEnd}
滚动动画结束时调用此函数。onContentSizeChange={this._onContentSizeChange}
此函数会在ScrollView内部可滚动内容的视图发生变化时调用。
调用参数为内容视图的宽和高: (contentWidth, contentHeight)。
此方法是通过绑定在内容容器上的onLayout来实现的。onScroll
在滚动的过程中,每帧最多调用一次此回调函数。调用的频率可以用scrollEventThrottle属性来控制。scrollTo()
scrollTo(([y]: number),object,([x]: number),([animated]: boolean),([duration]: number),
);
滚动到指定的x, y偏移处。第三个参数为是否启用平滑滚动动画。还有一个duration参数则是仅限android可以使用的滚动持续时间。
示例:
scrollTo({x: 0, y: 0, animated: true})
指定滚动持续时间的示例(仅限Android):
scrollTo({x: 0, y: 0, duration: 500})scrollToEnd()
scrollToEnd(([options]: {animated: boolean, duration: number}));
滚动到视图底部(水平方向的视图则滚动到最右边)。
加上动画参数scrollToEnd({animated: true})则启用平滑滚动动画,或是调用scrollToEnd({animated: false})来立即跳转。For Android, you may specify a duration, e.g. scrollToEnd({duration: 500}) for a controlled duration scroll。如果不使用参数,则animated选项默认启用。flashScrollIndicators()
短暂地显示滚动指示器。

1.4. 获取原生事件

a.滚动的时候,会传入一个合成事件作为监听滚动方法的参数,每个方法都会有这个合成事件
b.通过合成事件能获取原生事件nativeEvent,原生事件nativeEvent会有我们想要的信息.
c.什么是合成事件:在RN中,事件的处理由其内部自己实现的事件系统完成,触发的事件都叫做 合成事件(SyntheticEvent)

// 滚动完成的时候调用_onMomentumScrollEnd(e){// 获取原生事件var nativeEvent = e.nativeEvent//获取当前偏移量var contentX = nativeEvent.contentOffset.x//当前页var page = contentX / kScreenWidththis.setState({currentPage:page})}

2.FlatList

2.1FlatList介绍

a.React Native 提供了几个适用于展示长列表数据的组件,一般而言我们会选用FlatList或是SectionList。

b.FlatList组件用于显示一个垂直的滚动列表,其中的元素之间结构近似而仅数据不同。

c.FlatList更适于长列表数据,且元素个数可以增删。和ScrollView不同的是,FlatList并不立即渲染所有元素,而是优先渲染屏幕上可见的元素。

d.FlatList组件必须的两个属性是datarenderItemdata是列表的数据源,而renderItem则从数据源中逐个解析数据,然后返回一个设定好格式的组件来渲染。

2.2FlatList常用属性

data array
为了简化起见,data 属性目前只支持普通数组。如果需要使用其他特殊数据结构,例如 immutable 数组,请直接使用更底层的VirtualizedList组件。renderItem function
renderItem({ item: Object, index: number, separators: { highlight: Function, unhighlight: Function, updateProps: Function(select: string, newProps: Object) } }) => ?React.Element
从data中挨个取出数据并渲染到列表中。ItemSeparatorComponent component
行与行之间的分隔线组件。不会出现在第一行之前和最后一行之后。 By default, highlighted and leadingItem props are provided. renderItem provides separators.highlight/unhighlight which will update the highlighted prop, but you can also add custom props with separators.updateProps.ListEmptyComponent component, function, element
列表为空时渲染该组件。可以是 React Component, 也可以是一个 render 函数,或者渲染好的 element。ListHeaderComponent component, function, element
头部组件。可以是 React Component, 也可以是一个 render 函数,或者渲染好的 element。ListFooterComponent component, function, element
尾部组件。可以是 React Component, 也可以是一个 render 函数,或者渲染好的 element。extraData any
如果有除data以外的数据用在列表中(不论是用在renderItem还是头部或者尾部组件中),请在此属性中指定。同时此数据在修改时也需要先修改其引用地址(比如先复制到一个新的 Object 或者数组中),然后再修改其值,否则界面很可能不会刷新。getItemLayout
(data, index) => {length: number, offset: number, index: number}
getItemLayout是一个可选的优化,用于避免动态测量内容尺寸的开销,不过前提是你可以提前知道内容的高度。如果你的行高是固定的,getItemLayout用起来就既高效又简单,类似下面这样:getItemLayout={(data, index) => ({length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index})}
对于元素较多的列表(几百行)来说,添加getItemLayout可以极大地提高性能。注意如果你指定了ItemSeparatorComponent,请把分隔线的尺寸也考虑到 offset 的计算之中。horizontal
设置为 true 则变为水平布局模式。initialNumToRender
开始时屏幕顶端的元素是列表中的第 initialScrollIndex个元素, 而不是第一个元素。如果设置了这个属性,则第一批initialNumToRender范围内的元素不会再保留在内存里,而是直接立刻渲染位于 initialScrollIndex 位置的元素。需要先设置 getItemLayout 属性。keyExtractor
(item: object, index: number) => string;
此函数用于为给定的 item 生成一个不重复的 key。Key 的作用是使 React 能够区分同类元素的不同个体,以便在刷新时能够确定其变化的位置,减少重新渲染的开销。若不指定此函数,则默认抽取item.key作为 key 值。若item.key也不存在,则使用数组下标。onEndReached function
(info: {distanceFromEnd: number}) => void
当列表被滚动到距离内容最底部不足onEndReachedThreshold的距离时调用。onEndReachedThreshold number
决定当距离内容最底部还有多远时触发onEndReached回调。注意此参数是一个比值而非像素单位。比如,0.5 表示距离内容最底部的距离为当前列表可见长度的一半时触发。onRefresh
() => void
如果设置了此选项,则会在列表头部添加一个标准的RefreshControl控件,以便实现“下拉刷新”的功能。同时你需要正确设置refreshing属性。refreshing boolean
在等待加载新数据时将此属性设为 true,列表就会显示出一个正在加载的符号。

2.3FlatList常用方法

scrollToEnd()
scrollToEnd([params]);
滚动到底部。如果不设置getItemLayout属性的话,可能会比较卡。
Valid params keys are:
'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to true.scrollToIndex()
scrollToIndex(params);
将位于指定位置的元素滚动到可视区的指定位置,当viewPosition 为 0 时将它滚动到屏幕顶部,为 1 时将它滚动到屏幕底部,为 0.5 时将它滚动到屏幕中央。
注意:如果不设置getItemLayout属性的话,无法跳转到当前渲染区域以外的位置。
Valid params keys are:
'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to true.
'index' (number) - The index to scroll to. Required.
'viewOffset' (number) - A fixed number of pixels to offset the final target position. Required.
'viewPosition' (number) - A value of 0 places the item specified by index at the top, 1 at the bottom, and 0.5 centered in the middle.scrollToItem()
scrollToItem(params);
这个方法会顺序遍历元素。尽可能使用scrollToIndex代替。
注意:如果不设置getItemLayout属性的话,无法跳转到当前渲染区域以外的位置。
Valid params keys are:
'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to true.
'item' (object) - The item to scroll to. Required.
'viewPosition' (number)scrollToOffset()
scrollToOffset(params);
滚动列表到指定的偏移(以像素为单位),等同于ScrollView的scrollTo方法。
Valid params keys are:
'offset' (number) - The offset to scroll to. In case of horizontal being true, the offset is the x-value, in any other case the offset is the y-value. Required.
'animated' (boolean) - Whether the list should do an animation while scrolling. Defaults to true.

2.4FlatList示例

2.4.1示例

a.添加FlatList组件,指定关键属性data,renderItem,keyExtrator;

b.添加显示单条内容视图方法renderMovie,注意item是固定残数据名;

<FlatList//要显示的数据来源-数组 data=[]data={this.state.data}//定义显示单条内容视图renderItem={this.renderMovie}style={styles.list}//keyExtractor 此函数用于为给定的item生成一个不重复的key。Key的作用是使React能够区分
//同类元素的不同个体,以便在刷新时能够确定其变化的位置,减少重新渲染的开销。若不指定此函数,则默认抽
//取item.key作为key值。若item.key也不存在,则使用数组下标。keyExtractor={item => item.id}/>);renderMovie({ item }) {// { item }是一种“解构”写法,请阅读ES2015语法的相关文档// item也是FlatList中固定的参数名,请阅读FlatList的相关文档return (<View style={styles.container}><Imagesource={{ uri: item.posters.thumbnail }}style={styles.thumbnail}/><View style={styles.rightContainer}><Text style={styles.title}>{item.title}</Text><Text style={styles.year}>{item.year}</Text></View></View>);}

2.4.2.FlatList添加头部和尾部组件

return (<FlatListdata={this.state.data}renderItem={this.renderMovie}style={styles.list}ListHeaderComponent={this.headerComponent}ListFooterComponent={this.footerComponent}/>);}headerComponent(){return (<View style={styles.container}><Text>FlatList头部组件</Text></View>);}footerComponent(){return (<View style={styles.container}><Text>FlatList尾部组件</Text></View>);}

2.4.3.FlatList下拉刷新

return (<FlatListdata={this.state.data}renderItem={this.renderMovie}style={styles.list}//添加下拉刷新控件refreshControl={<RefreshControlrefreshing={this.state.refreshing}//刷新状态onRefresh={this._onRefresh}//刷新函数回调/>}/>);//刷新回调函数_onRefresh = () => {this.setState({refreshing: true});//设置状态正在刷新中setTimeout(()=>{this.setState({refreshing: false});//设置状态为刷新完成}, 2000);}

2.4.4.FlatList自动加载下一页

 return (<FlatListdata={this.state.data}renderItem={this.renderMovie}style={styles.list}//比如,0.3 表示距离内容最底部的距离为当前列表可见长度的一半时触发onEndReached。onEndReached={()=>this.onEndReached()}onEndReachedThreshold = { 0.3 }/>);onEndReached() {//加载下一页}

2.4.5.FlatList分割线

 ItemSeparatorComponent={()=>(<View style={{height: 5, backgroundColor: 'red'}} />)}

参考:

https://www.jianshu.com/p/4a0d1982f691

https://reactnative.cn/docs/flatlist/#itemseparatorcomponent

6.2React Native基础ScrollView和FlatList;相关推荐

  1. 基础篇章:React Native之 ScrollView 的讲解

    大家好,我是ScrollView,相信做过移动或者前端开发的人肯定都很熟悉我,对,我就是那个可以滚动的容器,滚有点难听,我是可以滑动的容器,我滑动起来,摩擦摩擦,似魔鬼的步伐.我不仅可以上下滚动,就是 ...

  2. react native学习笔记13——FlatList上拉加载

    我们可以利用官方组件RefreshControl实现下拉刷新功能,但React Native官方没有提供相应的上拉加载的组件,因此在RN中实现上拉加载比下拉刷新要复杂一点. 虽然没有直接提供上拉加载的 ...

  3. React Native基础入门教程:初步使用Flexbox布局

    一.长度的单位 在开始任何布局之前,让我们来首先需要知道,在写React Native组件样式时,长度的不带单位的,它表示"与设备像素密度无关的逻辑像素点". 这个怎么理解呢? 我 ...

  4. React Native之ScrollView控件详解

    概述 ScrollView在Android和ios原生开发中都比较常见,是一个 滚动视图控件.在RN开发中,系统也给我们提供了这么一个控件.不过在RN开发中 ,使用ScrollView必须有一个确定的 ...

  5. React Native入门(七)之列表组件的使用(2)关于FlatList的一切

    前言 在上一篇博客中了解了列表组件的相关内容,主要是静态的展示了一个列表数据,了解了ScrollVIew,FlatList和SectionList的基本用法,本篇文章就深入的了解一个常用的一个列表组件 ...

  6. react native ScrollView

    ScrollView是一个通用的可滚动的容器,你可以在其中放入多个组件和视图,而且这些组件并不需要是同类型的.ScrollView不仅可以垂直滚动,还能水平滚动(通过horizontal属性来设置). ...

  7. 关于ScrollView中嵌套FlatList的一点经验

    今天需要做一个包含滚动,上拉加载的界面,由于滚动区域包含一部分非上拉加载的模块,如下图所示 (请忽略我一会上拉一会下拉,统一视为上拉,懒得改图了...) 通过尝试多次,发现,ScrollView如果和 ...

  8. [React Native] 动画 · Animated

    [React Native] 动画 · Animated 如果要在一个 React Native 应用中添加动画效果,首先考虑的就是官方提供的 Animated .通过定义输入和输出的动画状态值,调用 ...

  9. React Native 移动开发入门与实战

    课程简介 本课程主要讲解 React 的基础知识及应用案例,包括 props.state.生命周期函数等,样式和 Flex 布局,React Native 内置的 API 和 UI 组件介绍.路由.状 ...

最新文章

  1. Java反射 - 私有字段和方法
  2. 我还没考试,算法就说我的物理一定挂科
  3. JavaScript实现fisherYates洗牌算法(附完整源码)
  4. 我们为什么推荐在Json中使用string表示Number属性值
  5. android群英传神兵利器pdf,《Android群英传:神兵利器》勘误
  6. Java控制台输入教程~~~~
  7. bzoj 1076 奖励关 状压+期望dp
  8. C#实现SQL SERVER2008聚合函数
  9. 2017.10.17笔记
  10. 卡巴斯基终身免费用的方法
  11. 常用搜索算法—盲目搜索和启发式搜索
  12. iOS通俗易懂的微信支付接入和爬坑指南,十分钟轻松搞完
  13. 浅释丹道筑基功―—―混元桩【转载】
  14. python 提取函数名/变量名(或将函数名/变量名转换为字符串)
  15. ASCII Grid
  16. VisualStudio/VS在一个项目中添加多个c++文件
  17. AI视屏处理(C++)
  18. 【linux】内核模块管理:lsmod、insmod、rmmod、modinfo、modprobe、depmod命令
  19. ArcGIS填补栅格中空值
  20. linux 心脏滴血漏洞,心脏出血漏洞(heartbleeder 自动检测 OpenSSL 心脏出血漏洞 (附修复指南))...

热门文章

  1. 软件测试实验三 测试需求挖掘与管理
  2. 全面屏适配(小米8,三星s8等)
  3. 如何去除pdf中的烦人水印(打开方式为wps)
  4. Mac与iPhone屏幕录制
  5. 表达式和内部函数(运算符/连接符/数字函数/字符串函数/日期函数/转换函数/format函数)
  6. 为什么BEV感知如此重要?下一代目标感知范式不能再错过了
  7. 编码速度非常慢_非 iPhone12 用户谨慎购买苹果无线充电器,速度非常慢
  8. PA 2.0 中的动态类型安全查询
  9. 泼辣修图教程:如何通过Polarr Photo打造艳丽夕阳效果
  10. 流畅度最高提升52% 全新MIUI13聚焦基础体验