1.还是网络问题,在网络出现问题或者无法加载数据的时候,一般我们会展示空白页,在空白页中提示 无数据 之类的提示,比较好的还会使用 指示器 的方式告诉用户网络出现问题等等。

这边我们做以下处理,当无数据时,我们就先初始化基础界面,然后展示 提示页面,等到有数据时,再重新渲染数据。

步骤一:首先设置 无数据 页面

GDNoDataView.js

  1. /**
  2. * 无数据情况 提示页
  3. */
  4. import React, { Component } from 'react';
  5. import {
  6. StyleSheet,
  7. Text,
  8. View,
  9. } from 'react-native';
  10.  
  11. export default class GDNoDataView extends Component {
  12.  
  13. render() {
  14. return (
  15. <View style={styles.container}>
  16. <Text style={styles.textStyle}>无数据</Text>
  17. </View>
  18. );
  19. }
  20. }
  21.  
  22. const styles = StyleSheet.create({
  23. container: {
  24. flex: 1,
  25. justifyContent:'center',
  26. alignItems:'center',
  27. },
  28.  
  29. textStyle: {
  30. fontSize: 21,
  31. color: 'gray',
  32. }
  33. });

步骤二:接着,没有数据的时候我们进行一些处理就可以了

GDHalfHourHot.js 调用

  1. /**
  2. * 近半小时热门
  3. */
  4. import React, { Component } from 'react';
  5. import {
  6. StyleSheet,
  7. Text,
  8. View,
  9. TouchableOpacity,
  10. Image,
  11. ListView,
  12. Dimensions,
  13. DeviceEventEmitter,
  14. } from 'react-native';
  15.  
  16. // 获取屏幕宽高
  17. const {width, height} = Dimensions.get('window');
  18.  
  19. // 引入自定义导航栏组件
  20. import CommunalNavBar from '../main/GDCommunalNavBar';
  21. // 引入 cell
  22. import CommunalHotCell from '../main/GDCommunalHotCell';
  23. // 引入 空白页组件
  24. import NoDataView from '../main/GDNoDataView';
  25.  
  26. export default class GDHalfHourHot extends Component {
  27.  
  28. // 构造
  29. constructor(props) {
  30. super(props);
  31. // 初始状态
  32. this.state = {
  33. dataSource: new ListView.DataSource({rowHasChanged:(r1, r2) => r1 !== r2}), // 数据源 优化
  34. loaded: false, // 用于判断是否显示空白页
  35. };
  36. // 绑定
  37. this.fetchData = this.fetchData.bind(this);
  38. }
  39.  
  40. // 网络请求
  41. fetchData() {
  42. // 测试没用数据的情况
  43. setTimeout(() => {
  44. fetch('http://guangdiu.com/api/gethots.php') // 请求地址
  45. .then((response) => response.json()) // 定义名称 将数据转为json格式
  46. .then((responseData) => { // 处理数据
  47. // 修改dataSource的值
  48. this.setState({
  49. dataSource: this.state.dataSource.cloneWithRows(responseData.data),
  50. loaded:true,
  51. });
  52. })
  53. .done(); // 结束
  54. },3000)
  55. }
  56.  
  57. // 跳回首页
  58. popToHome() {
  59. this.props.navigator.pop();
  60. }
  61.  
  62. // 返回中间按钮
  63. renderTitleItem() {
  64. return(
  65. <Text style={styles.navbarTitleItemStyle}>近半小时热门</Text>
  66. );
  67. }
  68.  
  69. // 返回右边按钮
  70. renderRightItem() {
  71. return(
  72. <TouchableOpacity
  73. onPress={() => {this.popToHome()}}
  74. >
  75. <Text style={styles.navbarRightItemStyle}>关闭</Text>
  76. </TouchableOpacity>
  77. );
  78. }
  79.  
  80. // 判断显示列表 还是 显示空白页
  81. renderListView() {
  82. if(this.state.loaded === false) {
  83. // 显示空白页
  84. return(
  85. <NoDataView />
  86. );
  87. }else{
  88. return(
  89. <ListView
  90. // 数据源 通过判断dataSource是否有变化,来判断是否要重新渲染
  91. dataSource={this.state.dataSource}
  92. renderRow={this.renderRow}
  93. // 隐藏水平线
  94. showsHorizontalScrollIndicator={false}
  95. style={styles.listViewStyle}
  96. initialListSize={5}
  97. // 返回 listView 头部
  98. renderHeader={this.renderHeader}
  99. />
  100. );
  101. }
  102. }
  103.  
  104. // 返回 listView 头部
  105. renderHeader() {
  106. return(
  107. <View style={styles.headerPromptStyle}>
  108. <Text>根据每条折扣的点击进行统计,每5分钟更新一次</Text>
  109. </View>
  110. );
  111. }
  112.  
  113. // 返回每一行cell的样式
  114. renderRow(rowData) {
  115. // 使用cell组件
  116. return(
  117. <CommunalHotCell
  118. image={rowData.image}
  119. title={rowData.title}
  120. />
  121. );
  122. }
  123.  
  124. componentWillMount() {
  125. // 向GDMain.js 发送通知 隐藏tabBar
  126. DeviceEventEmitter.emit('isHiddenTabBar', true);
  127. }
  128.  
  129. componentWillUnmount() {
  130. // 向GDMain.js 发送通知 显示tabBar
  131. DeviceEventEmitter.emit('isHiddenTabBar', false);
  132. }
  133.  
  134. // 生命周期 组件渲染完成 已经出现在dom文档里
  135. componentDidMount() {
  136. // 请求数据
  137. this.fetchData();
  138. }
  139.  
  140. render() {
  141. return (
  142. <View style={styles.container}>
  143. {/* 导航栏样式 */}
  144. <CommunalNavBar
  145. titleItem = {() => this.renderTitleItem()}
  146. rightItem = {() => this.renderRightItem()}
  147. />
  148.  
  149. {/* 根据网络状态决定是否渲染 listView */}
  150. {this.renderListView()}
  151. </View>
  152. );
  153. }
  154. }
  155.  
  156. const styles = StyleSheet.create({
  157. container: {
  158. flex:1,
  159. alignItems: 'center',
  160. },
  161.  
  162. navbarTitleItemStyle: {
  163. fontSize:17,
  164. color:'black',
  165. marginLeft:50
  166. },
  167. navbarRightItemStyle: {
  168. fontSize:17,
  169. color:'rgba(123,178,114,1.0)',
  170. marginRight:15
  171. },
  172.  
  173. headerPromptStyle: {
  174. height:44,
  175. width:width,
  176. backgroundColor:'rgba(239,239,239,0.5)',
  177. justifyContent:'center',
  178. alignItems:'center'
  179. },
  180.  
  181. listViewStyle: {
  182. width:width,
  183. }
  184. });

效果图:

 

React-Native 之 GD (六)无数据情况处理的更多相关文章

  1. React Native学习(六)—— 轮播图

    本文基于React Native 0.52 Demo上传到Git了,有需要可以看看,写了新内容会上传的.Git地址 https://github.com/gingerJY/React-Native-D ...

  2. React Native入门指南

    转载自:http://www.jianshu.com/p/b88944250b25 前言 React Native 诞生于 2015 年,名副其实的富二代,主要使命是为父出征,与 Apple 和 Go ...

  3. 写给移动开发者的 React Native 指南

    本文原创版权归 简书 wingjay 所有,如有转载,请于文章篇头位置显示标注原创作者及出处,以示尊重! 作者:wingjay 出处:http://www.jianshu.com/p/b8894425 ...

  4. React Native开发入门

    目录: 一.前言 二.什么是React Native 三.开发环境搭建 四.预备知识 五.最简单的React Native小程序 六.总结 七.参考资料   一.前言 虽然只是简单的了解了一下Reac ...

  5. 使用React Native来撰写跨平台的App

    React Native 是一个 JavaScript 的框架,用来撰写实时的.可原生呈现 iOS 和 Android 的应用.其是基于 React的,而 React 是 Facebook 的用于构建 ...

  6. 热门跨平台方案对比:WEEX、React Native、Flutter和PWA

    本文主要对WEEX.React Native.Flutter和PWA几大热门跨平台方案进行简单的介绍和对比.内容选自<WEEX跨平台开发实战> (WEEX项目负责人力荐,从入门到实战,教你 ...

  7. React Native 系列(六) -- PropTypes

    前言 本系列是基于React Native版本号0.44.3写的.在我们之前的通过props实现组件间传值的时候,大家有没有发现在父组件传递值过去,在子控件获取props的时候没有提示,那么如何能实现 ...

  8. React-Native(六):React Native完整的demo项目

    该项目在http://www.lcode.org/study-react-native-opensource-two/上发现 更有意思的发现这个网站https://juejin.im/是采用vue.j ...

  9. React Native 系列(六)

    前言 本系列是基于React Native版本号0.44.3写的.在我们之前的通过props实现组件间传值的时候,大家有没有发现在父组件传递值过去,在子控件获取props的时候没有提示,那么如何能实现 ...

随机推荐

  1. JS之理解继承

    JS之理解继承:https://segmentfault.com/a/1190000010468293 1.call继承,也叫借用构造函数.伪造对象或是经典继承.call继承回把父类的私有属性和方法继 ...

  2. P1106删数游戏

    这道题曾经在CQOJ上考过,是第二次做了. 这是一道使用字符串的贪心题.首先要根据机组例子来确定:删除递增序列的最后一位.即循环找到那一位后,把后面的数往前压.所以我在艰难处理完双重循环后(这个处理不 ...

  3. uboot第二阶段分析1

    一. uboot第二阶段初识 1.1. uboot第二阶段应该做什么 a. 概括来讲uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗.时钟),然后初始化DDR并且完成重定位. b.  ...

  4. [BZOJ 3771] Triple(FFT+容斥原理+生成函数)

    [BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...

  5. 题解 CF1119A 【Ilya and a Colorful Walk】

    此题就是:给你一个数组,让你找出两个不同的元素,并让它们的下标差距最大. 思路:从2到n,如果与1不同,记录距离,与原数比较,取大. 从1到n-1,如果与n不同,记录距离,与原数比较,取大. AC代码 ...

  6. KMP解决最小循环节问题

    # 10035. 「一本通 2.1 练习 1」Power Strings [题目描述] 给定若干个长度 $\le 10^6$​​ 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的.如 ...

  7. js面向过程-拖拽

    1.步骤分析: 1.1 获取id 1.2 当鼠标点击时执行的js 1.3当鼠标移动时执行的js 1.4当鼠标放开时执行的js 2.代码实现 <!DOCTYPE html> <html ...

  8. tornado + nginx + supervisord 环境部署

    学习tornado有一周多了,自己按着demo中的例子手动搬代码,收获还是有的,加深了理解.demo: http://demo.pythoner.com/itt2zh/ch8.html 大概明白了它怎 ...

  9. linux 打包和压缩的概念和区别

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名 给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar. ...

  10. JavaEE高级-MyBatis学习笔记

    一.MyBatis简介 - MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. - MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. - My ...