写点什么

ReactNative 进阶(四十一):应用 FlatList 实现分组列表

  • 2022 年 1 月 30 日
  • 本文字数:2659 字

    阅读完需:约 9 分钟

ReactNative进阶(四十一):应用 FlatList 实现分组列表

一、功能简介

FlatList为高性能的简单列表组件,支持下面这些常用的功能:


  • 完全跨平台。

  • 支持水平布局模式。

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

  • 支持单独的头部组件。

  • 支持单独的尾部组件。

  • 支持自定义行间分隔线。

  • 支持下拉刷新。

  • 支持上拉加载。

  • 支持跳转到指定行(ScrollToIndex)。

  • 如果需要分组/类/区(section),请使用SectionList


FlatListSectionList都是以VirtualizedList为底层实现的,FlatList 具有更高的灵活性(比如说在使用 immutable data 而不是 普通数组)的时候,才应该考虑使用VirtualizedList


Vritualization 通过维护一个有限的渲染窗口(其中包含可见的元素),并将渲染窗口之外的元素全部用合适的定长空白空间代替的方式,极大的改善了内存消耗以及在大数据量情况下的使用性能。这个渲染窗口能响应滚动行为。当一个元素离可视区太远时,它就有一个较低优先级;否则就获得一个较高的优先级。渲染窗口通过这种方式逐步渲染其中的元素(在进行了任何交互之后),以尽量减少出现空白区域的可能性。

二、属性说明

三、方法集合

四、简单应用示例

<FlatList  data={Details}  keyExtractor={(item, index) => index}  renderItem={this._renderItem(data)}  ListEmptyComponent={()=>{return(<Text style={styles.LookMoreStyle}>暂无记录</Text>)}}  // getItemLayout={(data,index)=>(  //     {length: AdaptationModel.scaleHeight(46), offset:AdaptationModel.scaleHeight(46) * index, index}  //     )}/>
_renderItem(data){ return <View style={styles.item}> <Text style={styles.text}>{data.item}</Text> </View> }
const styles = StyleSheet.create({ LookMoreStyle: { height: 32, width: AppSetting.ScreenWidth, textAlign: 'center', fontSize: AdaptationModel.setSpText(12), paddingTop: 10, backgroundColor: AppSetting.GRAY }, item:{ backgroundColor: '#168', height:200, marginRight:15, marginLeft:15, marginBottom:15, alignItems:'center', //justifyContetnt:'center', },})
复制代码

五、高阶应用示例

const {width,height}=Dimensions.get('window')export default class Main extends Component{  // 构造  constructor(props) {    super(props);  }  refreshing(){    let timer = setTimeout(()=>{          clearTimeout(timer)          alert('刷新成功')        },1500)  }  _onload(){    let timer = setTimeout(()=>{      clearTimeout(timer)      alert('加载成功')    },1500)  }  render() {    var data = [];    for (var i = 0; i < 100; i++) {      data.push({key: i, title: i + ''});    }
return ( <View style={{flex:1}}> <Button title='滚动到指定位置' onPress={()=>{ this._flatList.scrollToOffset({animated: true, offset: 2000}); }}/> <View style={{flex:1}}> <FlatList ref={(flatList)=>this._flatList = flatList} ListHeaderComponent={this._header} ListFooterComponent={this._footer} ItemSeparatorComponent={this._separator} renderItem={this._renderItem} onRefresh={this.refreshing} refreshing={false} onEndReachedThreshold={0} onEndReached={ this._onload } numColumns ={3} columnWrapperStyle={{borderWidth:2,borderColor:'black',paddingLeft:20}}
//horizontal={true}
getItemLayout={(data,index)=>( {length: 100, offset: (100+2) * index, index} )}
data={data}> </FlatList> </View>
</View> ); }
_renderItem = (item) => { var txt = '第' + item.index + '个' + ' title=' + item.item.title; var bgColor = item.index % 2 == 0 ? 'red' : 'blue'; return <Text style={[{flex:1,height:100,backgroundColor:bgColor},styles.txt]}>{txt}</Text> }
_header = () => { return <Text style={[styles.txt,{backgroundColor:'black'}]}>这是头部</Text>; }
_footer = () => { return <Text style={[styles.txt,{backgroundColor:'black'}]}>这是尾部</Text>; }
_separator = () => { return <View style={{height:2,backgroundColor:'yellow'}}/>; }
}const styles=StyleSheet.create({ container:{
}, content:{ width:width, height:height, backgroundColor:'yellow', justifyContent:'center', alignItems:'center' }, cell:{ height:100, backgroundColor:'purple', alignItems:'center', justifyContent:'center', borderBottomColor:'#ececec', borderBottomWidth:1
}, txt: { textAlign: 'center', textAlignVertical: 'center', color: 'white', fontSize: 30, }
})
复制代码

六、拓展阅读

七、延伸阅读 DeviceEventEmitter 实现发送和监听消息

移动端开发过程中,页面间信息传递是常见的应用场景。


注册、发送消息方式如下:


DeviceEventEmitter.emit('自定义名称',发送数据);
复制代码


消息监听方式如下:


DeviceEventEmitter.addListener('名称',(events) ={使用数据events});
复制代码


例如,在 A 页面注册和发送消息:


import {DeviceEventEmitter} from 'react-native';let param = {taobaoBind:false,walletSum:0.00,couponNum:0}DeviceEventEmitter.emit('meeting_receive’,param);  //发送消息,并携带param参数
复制代码


然后,B 页面监听消息,执行动作:


componentDidMount() {     //页面加载完毕,开启监听消息   this.eventMeetingReceive =DeviceEventEmitter.addListener('meeting_receive',        (events) =>{this.setState({walletSum : events.walletSum});});}
componentWillUnmount() { //当页面销毁时,移除事件的监听 this.eventMeetingReceive.remove();}
复制代码


发布于: 刚刚阅读数: 2
用户头像

No Silver Bullet 2021.07.09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
ReactNative进阶(四十一):应用 FlatList 实现分组列表