1.下拉刷新/上拉加载更多 组件(RefreshListView)

src/components/RefreshListView/index.js

/*** 下拉刷新/上拉加载更多 组件(RefreshListView)*/
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {View,Text,StyleSheet,FlatList,ActivityIndicator,TouchableOpacity,ViewPropTypes,RefreshControl
} from 'react-native'const RefreshState = {Idle: 0,HeaderRefreshing: 1,FooterRefreshing: 2,NoMoreData: 3,Failure: 4,EmptyData: 5,
}class RefreshListView extends PureComponent {static propTypes = {data: PropTypes.array.isRequired,renderItem: PropTypes.func.isRequired,refreshState: PropTypes.number.isRequired,listRef: PropTypes.node,onHeaderRefresh: PropTypes.func,footerContainerStyle: ViewPropTypes.style,footerTextStyle: ViewPropTypes.style,disabledSeparator: PropTypes.bool,disabledHeaderRefresh: PropTypes.bool,footerRefreshingText: PropTypes.string,footerFailureText: PropTypes.string,footerNoMoreDataText: PropTypes.string,footerEmptyDataText: PropTypes.string,ListEmptyComponent: PropTypes.node,footerRefreshingComponent: PropTypes.node,footerFailureComponent: PropTypes.node,footerNoMoreDataComponent: PropTypes.node,footerEmptyDataComponent: PropTypes.node,}static defaultProps = {disabledHeaderRefresh: false,footerRefreshingText: '数据加载中…',footerFailureText: '点击重新加载',footerNoMoreDataText: '已加载全部数据',footerEmptyDataText: '暂时没有相关数据',}componentWillReceiveProps(nextProps) {}componentDidUpdate(prevProps, prevState) {}onHeaderRefresh = () => {if (this.shouldStartHeaderRefreshing()) {this.props.onHeaderRefresh(RefreshState.HeaderRefreshing)}}onEndReached = () => {if (this.shouldStartFooterRefreshing()) {this.props.onFooterRefresh && this.props.onFooterRefresh(RefreshState.FooterRefreshing)}}shouldStartHeaderRefreshing = () => {if (this.props.refreshState == RefreshState.HeaderRefreshing || this.props.refreshState == RefreshState.FooterRefreshing) {return false}return true}shouldStartFooterRefreshing = () => {const {refreshState, data} = this.propsif (data.length == 0) {return false}return (refreshState == RefreshState.Idle)}renderSeparator = () => (<View style={{height: 1, backgroundColor: '#e0e0e0'}} />)renderFooter = () => {let footer = nulllet {footerRefreshingText,footerFailureText,footerNoMoreDataText,footerEmptyDataText,footerRefreshingComponent,footerFailureComponent,footerNoMoreDataComponent,footerEmptyDataComponent,} = this.propsswitch (this.props.refreshState) {case RefreshState.Idle: {footer = (<View style={styles.footerContainer} />)break}case RefreshState.Failure: {footer = (<TouchableOpacity onPress={() => {if (this.props.data.length == 0) {this.props.onHeaderRefresh && this.props.onHeaderRefresh(RefreshState.HeaderRefreshing)} else {this.props.onFooterRefresh && this.props.onFooterRefresh(RefreshState.FooterRefreshing)}}}>{footerFailureComponent ? footerFailureComponent : (<View style={styles.footerContainer}><Text style={styles.footerText}>{footerFailureText}</Text></View>)}</TouchableOpacity>)break}case RefreshState.EmptyData: {footer = (<TouchableOpacity onPress={() => {this.props.onHeaderRefresh && this.props.onHeaderRefresh(RefreshState.HeaderRefreshing)}}>{footerEmptyDataComponent ? footerEmptyDataComponent : (<View style={styles.footerContainer}><Text style={styles.footerText}>{footerEmptyDataText}</Text></View>)}</TouchableOpacity>)break}case RefreshState.FooterRefreshing: {footer = footerRefreshingComponent ? footerRefreshingComponent : (<View style={styles.footerContainer} ><ActivityIndicator size="small" color="#888888" /><Text style={[styles.footerText, {marginLeft: 7}]}>{footerRefreshingText}</Text></View>)break}case RefreshState.NoMoreData: {footer = footerNoMoreDataComponent ? footerNoMoreDataComponent : (<View style={styles.footerContainer} ><Text style={styles.footerText}>{footerNoMoreDataText}</Text></View>)break}}return footer}render() {const {renderItem, ...rest} = this.propsreturn (<FlatListref={this.props.listRef}{...rest}// 行与行之间的分隔线组件ItemSeparatorComponent={this.props.disabledSeparator?false:this.renderSeparator}// 列表为空时渲染该组件ListEmptyComponent={this.props.ListEmptyComponent}// 头部组件ListHeaderComponent={this.props.renderHeader}// 尾部组件ListFooterComponent={this.renderFooter}// 当列表被滚动到距离内容最底部不足onEndReachedThreshold的距离时调用onEndReached={this.onEndReached}// 刷新组件refreshControl={this.props.disabledHeaderRefresh?false:<RefreshControlcolors={['#00ff00',"#9Bd35A", "#689F38",]}refreshing={this.props.refreshState == RefreshState.HeaderRefreshing}onRefresh={this.onHeaderRefresh}/>}// 决定当距离内容最底部还有多远时触发onEndReached回调onEndReachedThreshold={0.1}// 根据行数据data,渲染每一行的组件renderItem={renderItem}/>)}
}const styles = StyleSheet.create({footerContainer: {flex: 1,flexDirection: 'row',justifyContent: 'center',alignItems: 'center',padding: 10,height: 44,},footerText: {fontSize: 14,color: '#555555',},
})export {RefreshState,
}export default RefreshListView;

2.页面调用

(1)定义全局变量

// 刷新状态
global.RefreshState = {Idle: 0, // 加载成功HeaderRefreshing: 1, // 开始下拉刷新FooterRefreshing: 2, // 开始上拉翻页NoMoreData: 3, // 加载全部数据Failure: 4, // 加载失败EmptyData: 5, // 服务器没有数据
}

(2)通用store

@observable
refreshState: any;/*** 改变refreshState的值* @param refreshState*/
@action setRefreshState(refreshState) {this.refreshState = refreshState
}

(3)当前 store

// 加载成功
this.setRefreshState(RefreshState.Idle);if(!res.data.topics.length){// 服务器没有数据this.setRefreshState(RefreshState.EmptyData);
}

(4)页面

const { data, refreshState, loadData, loadMoreData } = this.store;// 新闻列表
store = new NewsStore();// 子组件渲染
_renderRow(obj) {let item = obj.item;return (<ListRowkey={item.id}title={item.title}onPress={() => {// 跳转详情页Actions.homeDetailPage({detail: item})}}/>)
}<RefreshListViewdata={toJS(data)}keyExtractor={(item,index) => index.toString()}renderItem={this._renderRow.bind(this)}refreshState={refreshState}onHeaderRefresh={loadData.bind(this.store)}onFooterRefresh={loadMoreData.bind(this.store)}
/>

3.效果图

转载于:https://www.cnblogs.com/crazycode2/p/9533261.html

react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)相关推荐

  1. uni-app下拉刷新触底加载更多

    首先在pages.json 配置文件中配置    "enablePullDownRefresh": true  需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...

  2. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  3. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  4. 分享轮子-flutter下拉刷新上拉加载

    flutter下拉上拉组件轮子 什么是flutter? 首先说下flutter,估计这个应该挺多人没听过flutter这个框架,它是一个google推出的跨平台的移动应用UI框架,和React Nat ...

  5. Flutter开发之ListView下拉刷新上拉加载更多(35)

    在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...

  6. react-native 自定义 下拉刷新 / 上拉加载更多 组件

    1.封装 Scroller 组件 src/components/Scroller/index.js /*** 下拉刷新/上拉加载更多 组件(Scroller)*/ import React, {Com ...

  7. Android ListView 实现下拉刷新上拉加载

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频 ...

  8. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...

    麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...

  9. Litho的使用--下拉刷新上拉加载

    Litho的使用–下拉刷新上拉加载 上篇介绍了Litho的基本使用,本文看下日常操作RecyclerView的嵌套使用以及下拉刷新上拉加载. 准备工作 先模拟一下网络请求以及使用的bean类 @Eve ...

  10. (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据

    文章目录 一.点击过的新闻列表文字变灰 效果图 实现思路 导入ormlite数据库类依赖 利用ormlite创建数据库和表 创建数据库类MyDbHelper 创建数据库中的新闻实体类NewInfo 页 ...

最新文章

  1. 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
  2. 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据
  3. Kotlin极简教程:第5章 集合类
  4. Power Strings_JAVA
  5. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗
  6. JavaScript教程之快速入门
  7. Gentoo 安装日记 08 (安装stage3: 设置时区 和 Hostname)
  8. cnetos6.2搭建mysql_基于腾讯云的Centos6.2系统搭建Apache+Mysql+PHP开发环境
  9. ftp ---- 匿名用户(实例配置示例1:匿名用户登录)
  10. 软件包的安装(源码安装)
  11. 一条命令关掉centos所有不必要的服务和端口号
  12. IS-IS详解(十)——IS-IS 骨干区域与非骨干区域访问进阶
  13. apache做yum源_svn+apache的yum源安装方式
  14. 使用WebService获取第三方服务数据
  15. 【计算机基础】ff新推荐弹窗怎么彻底删除的解决方案
  16. #考试酷#A8_Increment and Decrement Operators
  17. 镜头评价指标及测试方法【四】————手机摄像头调查
  18. c#样条曲线命令_C# chart控件绘制曲线
  19. Python爬虫实践2,企业工商信息查询
  20. 《浪漫樱花之旅——日本樱花拍摄游感》

热门文章

  1. Gym 100342J Triatrip (求三元环的数量) (bitset优化)
  2. Windows2008 Server r2 64位显示桌面图标的方法
  3. input 标签左对齐
  4. HDOJ 2870 Largest Submatrix
  5. 设置一个类似手机的锁屏界面但又不知道如何操作
  6. HDU 3247 Resource Archiver(AC自动机 + 状压DP + bfs预处理)题解
  7. 数据库优化之简单理解
  8. 集合的洗牌,排序,拆分以及常用遍历方法
  9. PHP表单常用正则表达式(URL、HTTP、手机、邮箱等)
  10. 躲开Xilinx官网龟速的下载器