1.HomeTopView为首页头部内容,HomeTopListView为HomeTopView子视图。

2.HomeTopView.js

  1. /**
  2. * 首页头部内容
  3. */
  4. import React, { Component } from 'react';
  5. import {
  6. AppRegistry,
  7. StyleSheet,
  8. Text,
  9. View,
  10. ScrollView,
  11. Image,
  12. ListView
  13. } from 'react-native';
  14.  
  15. var Dimensions = require('Dimensions');
  16. var screenW = Dimensions.get('window').width;
  17.  
  18. /*======导入外部组件类======*/
  19. var TopListView = require('./HomeTopListView');
  20.  
  21. // 导入外部json数据
  22. var TopMenuJSON = require('../../LocalData/TopMenu.json');
  23.  
  24. // ES5
  25. var TopView = React.createClass({
  26. getInitialState(){
  27. return{
  28. activePage:0,
  29. }
  30. },
  31.  
  32. render() {
  33. return (
  34. <View style={styles.container}>
  35. {/*内容部分*/}
  36. <ScrollView
  37. horizontal={true}
  38. pagingEnabled={true}
  39. showsHorizontalScrollIndicator={false}
  40. onMomentumScrollEnd={this.onScrollAnimationEnd}
  41. >
  42. {this.renderScrollItem()}
  43. </ScrollView>
  44. {/*页码*/}
  45. <View style={styles.indicatorViewStyle}>
  46. {this.renderIndicator()}
  47. </View>
  48. </View>
  49. );
  50. },
  51.  
  52. // 当一帧滚动结束的时候调用
  53. onScrollAnimationEnd(e){
  54. // 计算当前页码
  55. var currentPage = Math.floor(e.nativeEvent.contentOffset.x / screenW);
  56. // 更新状态机
  57. this.setState({
  58. activePage:currentPage,
  59. });
  60. },
  61.  
  62. // 返回子视图
  63. renderScrollItem(){
  64. var itemArr = [];
  65. var dataArr = TopMenuJSON.data;
  66. for (var i=0;i<dataArr.length;i++){
  67. itemArr.push(
  68. <TopListView
  69. key={i}
  70. dataArr={dataArr[i]}
  71. />
  72. );
  73. }
  74. return itemArr;
  75. },
  76.  
  77. // 返回页码视图
  78. renderIndicator(){
  79. var indicatorArr = [],style;
  80.  
  81. for (var i=0;i<2;i++){
  82. // 设置圆点的样式
  83. style = (i == this.state.activePage) ? {color:'orange'} : {color:'gray'};
  84. indicatorArr.push(
  85. <Text key={i} style={[{fontSize:25},style]}>•</Text>
  86. );
  87. }
  88. return indicatorArr;
  89. }
  90. });
  91.  
  92. const styles = StyleSheet.create({
  93. container: {
  94. backgroundColor: 'white',
  95. },
  96. indicatorViewStyle:{
  97. flexDirection:'row',
  98. justifyContent:'center',
  99. },
  100. });
  101.  
  102. // 输出
  103. module.exports = TopView;

3.HomeTopListView.js

  1. /**
  2. * HomeTopView子视图
  3. */
  4. import React, { Component } from 'react';
  5. import {
  6. AppRegistry,
  7. StyleSheet,
  8. Text,
  9. View,
  10. Image,
  11. ListView,
  12. TouchableOpacity,
  13. Platform
  14. } from 'react-native';
  15.  
  16. var Dimensions = require('Dimensions');
  17. var screenW = Dimensions.get('window').width;
  18.  
  19. // 全局常量
  20. const cols = 5
  21. const cellW = Platform.OS == 'ios' ? 70 : 60;
  22. const cellH = 70;
  23. const vMargin = (screenW - cellW * cols) / (cols + 1);
  24.  
  25. // ES5
  26. var TopListView = React.createClass({
  27. getDefaultProps(){
  28. return{
  29. dataArr:[],
  30. }
  31. },
  32. getInitialState(){
  33. // 创建数据源
  34. var ds = new ListView.DataSource({rowHasChanged:(row1,row2)=>row1 !== row2});
  35. return{
  36. dataSource:ds.cloneWithRows(this.props.dataArr)
  37. }
  38. },
  39.  
  40. render() {
  41. return (
  42. <ListView
  43. dataSource={this.state.dataSource}
  44. renderRow={this.renderRow}
  45. contentContainerStyle={styles.contentViewStyle}
  46. scrollEnabled={false}
  47. />
  48. );
  49. },
  50.  
  51. // 返回具体的一行
  52. renderRow(rowData){
  53. return(
  54. <TouchableOpacity activeOpacity={0.8}>
  55. <View style={styles.cellStyle}>
  56. <Image source={{uri:rowData.image}} style={{width:52,height:52}} />
  57. <Text style={styles.titleStyle}>{rowData.title}</Text>
  58. </View>
  59. </TouchableOpacity>
  60. )
  61. }
  62. });
  63.  
  64. const styles = StyleSheet.create({
  65. contentViewStyle:{
  66. flexDirection:'row',
  67. flexWrap:'wrap',
  68. width:screenW,
  69. alignItems:'center',
  70. justifyContent:'center',
  71. },
  72. cellStyle:{
  73. alignItems:'center',
  74. justifyContent:'center',
  75. marginTop:10,
  76. width:cellW,
  77. height:cellH,
  78. marginLeft:vMargin,
  79. },
  80. titleStyle:{
  81. fontSize:Platform.OS == 'ios' ? 14 : 12,
  82. color:'gray'
  83. },
  84. });
  85.  
  86. // 输出
  87. module.exports = TopListView;

4.Home.js 引入 HomeTopView 组件

  1. /**
  2. * 首页
  3. */
  4. import React, { Component } from 'react';
  5. import {
  6. AppRegistry,
  7. StyleSheet,
  8. Text,
  9. View,
  10. TouchableOpacity,
  11. TextInput,
  12. Image,
  13. Platform,
  14. ScrollView
  15. } from 'react-native';
  16.  
  17. var Dimensions = require('Dimensions');
  18. var screenW = Dimensions.get('window').width;
  19. var screenH = Dimensions.get('window').height;
  20.  
  21. /*======导入外部组件类======*/
  22. var HomeDetail = require('./HomeDetail');
  23. var TopView = require('./HomeTopView');
  24.  
  25. // ES5
  26. var Home = React.createClass({
  27. render() {
  28. return (
  29. <View style={styles.container}>
  30. {/*首页的导航条*/}
  31. {this.renderNavBar()}
  32. {/*首页主要内容*/}
  33. <ScrollView>
  34. {/*头部的View*/}
  35. <TopView />
  36. </ScrollView>
  37. </View>
  38. );
  39. },
  40.  
  41. // 首页的导航条
  42. renderNavBar(){
  43. return(
  44. <View style={styles.navBarStyle}>
  45. <TouchableOpacity onPress={()=>{this.pushToDetail()}} >
  46. <Text style={styles.leftTitleStyle}>宁波</Text>
  47. </TouchableOpacity>
  48. <TextInput placeholder="输入商家,品类,商圈" style={styles.topInputStyle} />
  49. <View style={styles.rightNavViewStyle}>
  50. <TouchableOpacity onPress={()=>{alert('点击了')}} >
  51. <Image source={{uri:'icon_homepage_message'}} style={styles.navRightImgStyle} />
  52. </TouchableOpacity>
  53. <TouchableOpacity onPress={()=>{alert('点击了')}} >
  54. <Image source={{uri:'icon_homepage_scan'}} style={styles.navRightImgStyle} />
  55. </TouchableOpacity>
  56. </View>
  57. </View>
  58. )
  59. },
  60.  
  61. // 跳转到首页详细页
  62. pushToDetail(data){
  63. this.props.navigator.push({
  64. component:HomeDetail, // 要跳转过去的组件
  65. title:'首页详细页'
  66. });
  67. },
  68. });
  69.  
  70. const styles = StyleSheet.create({
  71. // 导航栏
  72. navBarStyle:{
  73. height:Platform.OS === 'ios' ? 64 : 44,
  74. backgroundColor:'rgba(255,96,0,1)',
  75. // 主轴方向
  76. flexDirection:'row',
  77. // 侧轴对齐方式 垂直居中
  78. alignItems:'center',
  79. // 主轴对齐方式
  80. justifyContent:'space-around', // 平均分布
  81. },
  82. // 导航条左侧文字
  83. leftTitleStyle:{
  84. color:'white',
  85. fontSize:16,
  86. },
  87. // 导航栏输入框
  88. topInputStyle:{
  89. width:screenW * 0.71,
  90. height:Platform.OS === 'ios' ? 35 : 30,
  91. backgroundColor:'white',
  92. marginTop:Platform.OS === 'ios' ? 18 : 0,
  93. // 圆角
  94. borderRadius:18,
  95. paddingLeft:10,
  96. },
  97. // 导航条右侧视图
  98. rightNavViewStyle:{
  99. flexDirection:'row',
  100. height:64,
  101. // 侧轴对齐方式
  102. alignItems:'center',
  103. // backgroundColor:'blue',
  104. },
  105. // 导航栏右侧图片
  106. navRightImgStyle:{
  107. width:Platform.OS === 'ios' ? 28 : 24,
  108. height:Platform.OS === 'ios' ? 28 : 24,
  109. },
  110. container: {
  111. flex: 1,
  112. backgroundColor: '#e8e8e8',
  113. },
  114. welcome: {
  115. fontSize: 20,
  116. textAlign: 'center',
  117. margin: 10,
  118. },
  119.  
  120. });
  121.  
  122. // 输出
  123. module.exports = Home;

5.json数据

  1. {
  2. "data": [
  3. [{
  4. "title" : "美食",
  5. "image" : "ms"
  6. },
  7. {
  8. "title" : "电影",
  9. "image" : "dy"
  10. },
  11. {
  12. "title" : "酒店",
  13. "image" : "jd"
  14. },
  15. {
  16. "title" : "休闲娱乐",
  17. "image" : "xxyl"
  18. },
  19. {
  20. "title" : "外卖",
  21. "image" : "wm"
  22. },
  23. {
  24. "title" : "自助餐",
  25. "image" : "zzc"
  26. },
  27. {
  28. "title" : "KTV",
  29. "image" : "ktv"
  30. },
  31. {
  32. "title" : "火车票机票",
  33. "image" : "hcpjp"
  34. },
  35. {
  36. "title" : "丽人",
  37. "image" : "lr"
  38. },
  39. {
  40. "title" : "周边游",
  41. "image" : "zby"
  42. }
  43. ],
  44. [
  45. {
  46. "title" : "足疗按摩",
  47. "image" : "zlam"
  48. },
  49. {
  50. "title" : "购物",
  51. "image" : "gw"
  52. },
  53. {
  54. "title" : "今日新单",
  55. "image" : "jrxd"
  56. },
  57. {
  58. "title" : "小吃快餐",
  59. "image" : "xckc"
  60. },
  61. {
  62. "title" : "生活服务",
  63. "image" : "shfw"
  64. },
  65. {
  66. "title" : "甜点饮品",
  67. "image" : "tdyp"
  68. },
  69. {
  70. "title" : "美甲",
  71. "image" : "mj"
  72. },
  73. {
  74. "title" : "景点门票",
  75. "image" : "jdmp"
  76. },
  77. {
  78. "title" : "旅游",
  79. "image" : "ly"
  80. },
  81. {
  82. "title" : "全部分类",
  83. "image" : "qbfl"
  84. }]
  85. ]
  86. }

  

6.效果图

React Native商城项目实战12 - 首页头部内容的更多相关文章

  1. React Native商城项目实战15 - 首页购物中心

    1.公共的标题栏组件TitleCommonCell.js /** * 首页购物中心 */ import React, { Component } from 'react'; import { AppR ...

  2. React Native商城项目实战14 - 首页中间下部分

    1.MiddleBottomView.js /** * 首页中间下部分 */ import React, { Component } from 'react'; import { AppRegistr ...

  3. React Native商城项目实战13 - 首页中间上部分内容

    1.HomeMiddleView.js /** * 首页中间上部分内容 */ import React, { Component } from 'react'; import { AppRegistr ...

  4. React Native商城项目实战11 - 个人中心头部内容

    1.创建MineHeaderView.js /** * 个人中心头部内容 */ import React, { Component } from 'react'; import { AppRegist ...

  5. React Native商城项目实战16 - 购物中心详细页

    逻辑分析: 首页(Home)加载的购物中心组件(ShopCenter),传递url数据: ShopCenter里根据url加载购物中心详细页组件(ShopCenterDetail), ShopCent ...

  6. React Native商城项目实战05 - 设置首页的导航条

    1.Home.js /** * 首页 */ import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Te ...

  7. React Native商城项目实战04 - 封装TabNavigator.Item的创建

    1.Main.js /** * 主页面 */ import React, { Component } from 'react'; import { StyleSheet, Text, View, Im ...

  8. React Native商城项目实战02 - 主要框架部分(tabBar)

    1.安装插件,cd到项目根目录下执行: $ npm i react-native-tab-navigator --save 2.主框架文件Main.js /** * 主页面 */ import Rea ...

  9. React Native商城项目实战03 - 包装Navigator

    1.在Home目录下新建首页详细页HomeDetail.js /** * 首页详情页 */ import React, { Component } from 'react'; import { App ...

随机推荐

  1. RabbitMq学习2-php命令行模式测试rabbitmq

    一.RabbitMQ结构 1.几个概念说明:       Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体 ...

  2. 思维体操: HDU1022Train Problem I

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. echarts markLine 辅助线非直线设置

    效果图: 用例option: option = { title: { text: '未来一周气温变化', subtext: '纯属虚构' }, tooltip: { trigger: 'axis' } ...

  4. P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)

    P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...

  5. 使用GET与POST方式获取html数据

    抓取网站数据解析的工作,其中,使用到GET和POST方法获取html数据. 使用GET方式: /** * 使用get方式获取html数据 * * @param strURL(需要访问的网站) * @r ...

  6. CDate()函数

    CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant. CDate(date) date 参数是任意有效的日期表达式. 说明 IsDate 函数用于判断 date 是否 ...

  7. 10年前文章_ vi编辑器查找与替换方法

    vi编辑器查找与替换方法1.查找:/ 当前行往下找:? 当前行往上找找到后继续查找同方向 n反方向 N2.替换格式: range s/source/target/g解释:range表示要搜索的范围 & ...

  8. ztree 获取CheckBox选中节点时,不获取选中上级父节点

    //将第三个参数改为false,表示不去勾选父节点下的所有子节点 zTreeObj.checkNode(node, true, false); setting.check.chkboxType = { ...

  9. 【洛谷P3959】宝藏

    题目大意:比较复杂,点 这里 看题. 题解:对于状态压缩 dp 来讲,阶段的确立十分重要.本题中,采用以层次为阶段进行状压 dp. 设状态 \(f[i][S]\) 表示开凿到深度 \(i\),当前已经 ...

  10. django搭建一个小型的服务器运维网站-查看和修改服务器配置与数据库的路由

    目录 项目介绍和源码: 拿来即用的bootstrap模板: 服务器SSH服务配置与python中paramiko的使用: 用户登陆与session; 最简单的实践之修改服务器时间: 查看和修改服务器配 ...