react-native 模仿原生 实现下拉刷新/上拉加载更多(RefreshListView)
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)相关推荐
- uni-app下拉刷新触底加载更多
首先在pages.json 配置文件中配置 "enablePullDownRefresh": true 需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...
- recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)
下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...
- Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表
本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...
- 分享轮子-flutter下拉刷新上拉加载
flutter下拉上拉组件轮子 什么是flutter? 首先说下flutter,估计这个应该挺多人没听过flutter这个框架,它是一个google推出的跨平台的移动应用UI框架,和React Nat ...
- Flutter开发之ListView下拉刷新上拉加载更多(35)
在Flutter开发之ListView组件(21) 文章中,我们了解了ListView组件的基本使用.但是数据比较少,没有涉及分页加载.而实际开发中,下拉刷新和分页加载几乎是所有APP的标配.在iOS ...
- react-native 自定义 下拉刷新 / 上拉加载更多 组件
1.封装 Scroller 组件 src/components/Scroller/index.js /*** 下拉刷新/上拉加载更多 组件(Scroller)*/ import React, {Com ...
- Android ListView 实现下拉刷新上拉加载
转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频 ...
- android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...
麦洛遇到这样一个需求,实现类似于IOS下拉刷新,上拉加载更多的控件.麦洛google,baidu了一番,网上有不少实现,比较常见的是国外牛人的实现,不过国外的实现基本上都是扩展于ListView,所以 ...
- Litho的使用--下拉刷新上拉加载
Litho的使用–下拉刷新上拉加载 上篇介绍了Litho的基本使用,本文看下日常操作RecyclerView的嵌套使用以及下拉刷新上拉加载. 准备工作 先模拟一下网络请求以及使用的bean类 @Eve ...
- (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
文章目录 一.点击过的新闻列表文字变灰 效果图 实现思路 导入ormlite数据库类依赖 利用ormlite创建数据库和表 创建数据库类MyDbHelper 创建数据库中的新闻实体类NewInfo 页 ...
最新文章
- 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
- 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据
- Kotlin极简教程:第5章 集合类
- Power Strings_JAVA
- 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗
- JavaScript教程之快速入门
- Gentoo 安装日记 08 (安装stage3: 设置时区 和 Hostname)
- cnetos6.2搭建mysql_基于腾讯云的Centos6.2系统搭建Apache+Mysql+PHP开发环境
- ftp ---- 匿名用户(实例配置示例1:匿名用户登录)
- 软件包的安装(源码安装)
- 一条命令关掉centos所有不必要的服务和端口号
- IS-IS详解(十)——IS-IS 骨干区域与非骨干区域访问进阶
- apache做yum源_svn+apache的yum源安装方式
- 使用WebService获取第三方服务数据
- 【计算机基础】ff新推荐弹窗怎么彻底删除的解决方案
- #考试酷#A8_Increment and Decrement Operators
- 镜头评价指标及测试方法【四】————手机摄像头调查
- c#样条曲线命令_C# chart控件绘制曲线
- Python爬虫实践2,企业工商信息查询
- 《浪漫樱花之旅——日本樱花拍摄游感》