首页 > 网络编程 > JavaScript > 正文

react native基于FlatList下拉刷新上拉加载实现代码示例_javascript技巧

2018-10-12 16:09:32

react native 的上拉加载一直困扰着自己,一直用的第三方组件,但是可维护性不高,而且也不太好用,最近工作没那么忙,就研究下了官方的FlatList,做出来的成果,比第三方组件流畅度高好多,而且也很好用

官方介绍:https://reactnative.cn/docs/flatlist/

下面是效果图:

ios效果图

android效果图

总体思路就是:就是计算屏幕高度,然后减去导航的头部,根据列表高度计算出每页的个数,然后向上取整。这样做的目的是:防止不满屏状态下的,onEndReached函数的主动触发。

方法实现:

 //满屏页面判断 fullScreenJusting(ItemHeight) {  const screnHeight = screnInfo.size.height;   //屏幕高度  //计算列表个数  const listNum = (screnHeight - 40) / ItemHeight;  return Math.ceil(listNum); }

下拉刷新用的是 RefreshControl

官网地址:https://reactnative.cn/docs/refreshcontrol/#progressbackgroundcolor

具体代码:

import React, { Component } from 'react';import { View, Text, Image, StyleSheet, FlatList, RefreshControl, ActivityIndicator,} from 'react-native';import { SafeAreaView } from 'react-navigation';import screnInfo from '../utils/View';import BaseStyle from '../constants/Style';import { QUESTION_LIST } from '../constants/Api';import { form_req } from '../utils/Request';export default class TestScreen extends Component { constructor(props) {  super(props);  this.state = {   data: [   ],   refreshing: false,   fresh: true,   animating: true,   nomore: false,   pageSize: 0,   pageNumber: 1,  }; } componentDidMount() { //初始化的时候要判断长度 控制上拉加载  const ListNums = this.fullScreenJusting(50);  this.setState({   pageSize: ListNums  })  this.onEndReachedCalled = false;   this.getOrderList(ListNums, 1, true); } //满屏页面判断 fullScreenJusting(ItemHeight) {  const screnHeight = screnInfo.size.height;   //屏幕高度  //计算列表个数  const listNum = (screnHeight - 40) / ItemHeight;  return Math.ceil(listNum); } getOrderList(ListNums, pageNumber, fresh) {  let nomore;  form_req(QUESTION_LIST, {   page: pageNumber,   perpage: ListNums,  }).then(res => {   if (res.code == 200) {    const item = res.data;    if (item.length < ListNums) {     nomore = true    } else {     nomore = false    }    if (fresh) {     this.setState({      data: item,      nomore: nomore     })         } else {     this.setState({      data: this.state.data.concat(item),      nomore: nomore,     })    }    // this.onEndReachedCalledDuringMomentum = true;   } else {   }  }); } renderItem = item => {  return (   <View style={styles.item} key={item.id}>    <Text>{item.name}</Text>   </View>  ); }; //列表线 ItemSeparatorComponent = () => {  return <View style={styles.baseLine} />; }; //头部 ListHeaderComponent = () => { }; //尾部 ListFooterComponent = () => {  return (   <View style={styles.bottomfoot}>    {     this.state.data.length != 0 ?      this.state.nomore ? (       <Text style={styles.footText}>- 我是有底线的 -</Text>      ) : (        <View style={styles.activeLoad}>         <ActivityIndicator size="small" animating={this.state.animating} />         <Text style={[styles.footText, styles.ml]}>加载更多...</Text>        </View>       )      :      null    }   </View>  ); }; //为空时 ListEmptyComponent() {  return (   <View style={styles.noListView}>    {/* <Image     style={styles.noListImage}     source={require('../images/status/order_no_record.png')}    /> */}    <Text style={styles.NoListText}>暂无订单</Text>   </View>  ); } _keyExtractor = (item,index) => item.id; _onEndReached = () => {  if (!this.state.nomore && this.onEndReachedCalled ) {   this.getOrderList(this.state.pageSize, ++this.state.pageNumber, false);  }  this.onEndReachedCalled=true; }; _onRefresh() {  this.setState({ nomore: false, pageNumber: 1 }, () => {   this.getOrderList(this.state.pageSize, 1, true);  }) } render() {  return (   <SafeAreaView style={BaseStyle.flex}>    <View style={styles.listConten}>     <FlatList      data={this.state.data}      keyExtractor={this._keyExtractor}      onEndReached={this._onEndReached}      refreshing={true}      renderItem={({ item }) => this.renderItem(item)}      ItemSeparatorComponent={this.ItemSeparatorComponent}      ListEmptyComponent={this.ListEmptyComponent}      ListFooterComponent={this.ListFooterComponent}      onEndReachedThreshold={0.1}      refreshControl={       <RefreshControl        refreshing={this.state.refreshing}        colors={['#ff0000', '#00ff00', '#0000ff']}        progressBackgroundColor={"#ffffff"}        onRefresh={() => {         this._onRefresh();        }}       />      }     />    </View>   </SafeAreaView>  ); }}const styles = StyleSheet.create({ listConten: {  flex: 1,  backgroundColor: '#ffffff', }, item: {  flexDirection: 'row',  justifyContent: 'center',  alignItems: "center",  backgroundColor: '#ffffff',  height: 50, }, baseLine: {  width: screnInfo.size.width,  height: 1,  backgroundColor: '#eeeeee', }, noListView: {  width: screnInfo.size.width,  height: screnInfo.size.height - 140,  justifyContent: 'center',  alignItems: 'center', }, NoListText: {  marginTop: 15,  fontSize: 18,  color: '#999999', }, noListImage: {  width: 130,  height: 140, }, bottomfoot: {  flexDirection: 'row',  justifyContent: 'center',  alignItems: 'center',  padding: 10, }, footText: {  marginTop: 5,  fontSize: 12,  color: '#999999', }, activeLoad: {  flexDirection: 'row',  justifyContent: 'center',  alignItems: 'center', }, ml: {  marginLeft: 10, },});

这里的坑就是:当初始化进来页面的时候 上拉会主动触发,所以这里加了一个开关 this.onEndReachedCalled = false; 初始化给一个false 当触发了 设为true,放在调取接口之后

代码都很简单易懂~ 有什么不懂的,或者有什么问题请留言,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 相关标签:JavaScript
  • 本文发布HTML5中文学习网 ,转载请注明出处,感谢您!
  • 相关文章


  • 曝网友假装外国人写投诉信 ofo秒退押金并回函致歉
  • 苹果市值缩水逾2000亿美元 遭多家投行下调目标价
  • Asp.net Core与类库读取配置文件信息的方法_实用技巧
  • asp.net在Repeater嵌套的Repeater中使用复选框详解_实用技巧
  • 利用IIS调试ASP.NET网站程序的完整步骤_实用技巧
  • Asp.Net Core轻松学习系列之配置文件_实用技巧
  • ASP.NET 页生命周期概述(小结)_实用技巧
  • 详解ASP.NET Core WebApi 返回统一格式参数_实用技巧
  • 2018年网络流行语有哪些?2018年十大网络流行语盘点
  • 华为首席财务官孟晚舟被暂扣 深圳市政府要求加方立即放人!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    作者信息

    kevin

    永远在学习的路上!

    相关教程

  • javascript初级视频教程 javascript初级视频教程
  • jquery 基础视频教程 jquery 基础视频教程
  • javascript三级联动视频教程 javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程 独孤九贱(6)_jQuery视频教程
  • 热门教程