热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

ReactNative制作仿美团APP总结

最近学习了一个网上的ReactNative项目,利用ReactNative制作一个类似于美团的App,项目属于对之前ReactNative常用组件的基本

        最近学习了一个网上的React Native项目,利用React Native制作一个类似于美团的App,项目属于对之前React Native常用组件的基本使用,但是仍有一些关键点值得记录。最后做成的效果如下:

    接着就需要把这些数据填充到界面上,界面上的显示模块是固定的,例如主页中的活动模块如下:

   

    可以看到活动广告模块可以分为三类:MediumBlock(左上角粉色框)、SmallBlock(绿色框)、LargeBlock(蓝色框),可以将这三类框分别抽象为组件,然后排布到页面上。例如SmallBlock.js:

export default class SmallBlock extends Component {render() {return (<TouchableOpacity style&#61;{styles.container}>
<View>
<Text style&#61;{[{color:this.props.data.typeface_color},styles.title]}>
{this.props.data.title}Text>
<Text>{this.props.data.deputytitle}Text>
View>
<Image source&#61;{{uri:this.handleUrl(this.props.data.imageurl)}} style&#61;{styles.image}/>

TouchableOpacity>
)}handleUrl(url){let imageUrl&#61;&#39;&#39;;
if(url.indexOf(&#39;w.h&#39;)&#61;&#61;&#61;-1){imageUrl&#61;url;
}else {//美团的图片url中有w.h字段&#xff0c;代表图片的长与宽&#xff0c;需要替换后才能得到图片
imageUrl&#61;url.replace(&#39;w.h&#39;,&#39;60.60&#39;);
}return imageUrl;
}
}    在页面中调用组件&#xff0c;并填充数据&#xff1a;

<SmallBlock data&#61;{this.props.shopList[4]}/>

6、反向事件绑定

    例如将商家页面shopScreen.js中的“购物中心”封装成为一个组件ShopCenter&#xff0c;

        

        当点击它时跳转到详情页shopDetail.js&#xff0c;但是在每个ShopCenter组件中是没办法处理跳转事件的&#xff0c;只有在ShopScreen类中才可以访问到navigation对象&#xff0c;实现跳转。因此需要在ShopScreen中调用ShopCenter组件时&#xff0c;为其绑定一个事件属性onClick&#xff08;这个属性名可自定&#xff09;&#xff0c;然后在ShopCenter组件中点击时调用该属性触发父组件中对应的事件&#xff1a;

    例如父组件中调用子组件ShopCenter以及绑定onClick属性为jumpDetail函数&#xff1a;

<ShopCenter key&#61;{index} data&#61;{item} onClick&#61;{this.jumpDetail}/>
...
jumpDetail(url){navigation.navigate(&#39;Detail&#39;,url);
}    其中变量navigation是this.props.navigation&#xff0c;是由StackNavigator传递给它的子组件的&#xff0c;我直接使用时&#xff0c;会报错this.props未定义&#xff0c;于是我把它保存到一个全局变量navigation中&#xff0c;然后再调用其navigate方法。

    在子组件ShopCenter中点击触发jumpTo函数来调用父组件属性onClick

export default class ShopCenter extends Component {render() {return (<TouchableOpacity style&#61;{styles.container}onPress&#61;{()&#61;>this.jumpTo(this.props.data.detailurl)}>
<Image source&#61;{{uri:this.props.data.img}} style&#61;{styles.image} />
<Text style&#61;{styles.imageLabel}>{this.props.data.showtext.text}Text>
<Text style&#61;{styles.name}>{this.props.data.name}Text>
TouchableOpacity>
)}jumpTo(detailurl){let url&#61;detailurl;//对url进行处理&#xff0c;去掉url前面没用的部分
url&#61;detailurl.replace(&#39;imeituan://www.meituan.com/web/?url&#61;&#39;,&#39;&#39;);
this.props.onClick({url:url});//触发父组件onOnclick&#xff0c;并传入url参数
}
}

7、Hybrid开发思维

       App中并不是所有的页面都是写死的&#xff0c;这样很不易于维护与更新。一些页面是通过网页来实现的&#xff0c;在App中点击时跳转到对应的网页。当我们想要修改时&#xff0c;只需要更新在服务器端网页就可以&#xff0c;而不必更新App、重新发布等。这种思维就是一种Hybrid混合开发的思维。

        例如当点击购物中心时跳转到ShopDetail页面&#xff0c;并通过navigation传入对应网页的url&#xff0c;在ShopDetail中只需通过组件将网页呈现出来即可。

    

        ShopDetail.js就只有很短几行用于呈现WebView:

export default class ShopDetail extends Component {static navigationOptions&#61;{title:&#39;商场详情&#39;,
headerStyle:{ //导航栏样式设置
backgroundColor:&#39;#8bffce&#39;,
},
};
render() {let url&#61;this.props.navigation.state.params.url&#43; &#39;?uuid&#61;5C7B6342814C7B496D836A69C872&#39;; return (<WebView source&#61;{{uri: url}}JavascriptEnabled&#61;{true}domStorageEnabled&#61;{true}/>
)}
}

8、打包发布

    之前一直通过debug来将react native安装到手机上&#xff0c;如果需要发行则需要打包生成apk。


8.1、生成签名

    Android要求所有应用都有一个数字签名才会被允许安装在用户手机上&#xff0c;所有首先需要生成一个签名密钥。要通过keytool生成密钥&#xff0c;首先进入jdk下的bin目录&#xff0c;打开cmd输入如下命令

keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000

    其中my-release-key为密钥库的名字&#xff0c;my-key-alias为密钥库别名可以自定义&#xff0c;接着会出现命令行提示&#xff0c;要求输入相关信息&#xff0c;并设置相关密码&#xff0c;之后会在当前目录下生成my-release-key.keystore文件。

    把该文件拷贝到react native工程下的android/app目录下


8.2设置全局gradle

    在C:\Users\你的用户名\.gradle目录下新建gradle.properties文件&#xff0c;并在其中输入如下内容&#xff1a;

MYAPP_RELEASE_STORE_FILE&#61;my-release-key.keystore 密钥库的名字
MYAPP_RELEASE_KEY_ALIAS&#61;my-key-alias                 密钥库别名
MYAPP_RELEASE_STORE_PASSWORD&#61;*****                   密钥库密码 
MYAPP_RELEASE_KEY_PASSWORD&#61;*****                     密钥密
      我的密钥密码与库密码一致


8.3、配置项目的gradle文件

    打开react native项目下的android/app/build.gradle文件&#xff0c;添加如下内容

android {...defaultConfig { ... }signingConfigs {release {storeFile file(MYAPP_RELEASE_STORE_FILE)storePassword MYAPP_RELEASE_STORE_PASSWORDkeyAlias MYAPP_RELEASE_KEY_ALIASkeyPassword MYAPP_RELEASE_KEY_PASSWORD}}buildTypes {release {...signingConfig signingConfigs.release}}
}
    



8.4、生成apk

    进入react native项目的android目录下执行cmd命令&#xff1a;

gradlew assembleRelease    生成的apk文件位于项目的
android/app/build/outputs/apk/app-release.apk


在GitHub上的代码仓库为&#xff1a;https://github.com/SuperTory/React-Native-ECommerce


推荐阅读
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 本文介绍了如何在React和React Native项目中使用JavaScript进行日期格式化,提供了获取近7天、近半年及近一年日期的具体实现方法。 ... [详细]
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了如何在 Windows 环境下使用 node-gyp 工具进行 Node.js 本地扩展的编译和配置,涵盖从环境搭建到代码实现的全过程。 ... [详细]
  • 本文介绍了一种在 MySQL 客户端执行 NOW() 函数时出现时间偏差的问题,并详细描述了如何通过配置文件调整时区设置来解决该问题。演示场景中,假设当前北京时间为2023年2月17日19:31:37,而查询结果显示的时间比实际时间晚8小时。 ... [详细]
  • 本文探讨了Java编程的核心要素,特别是其面向对象的特性,并详细介绍了Java虚拟机、类装载器体系结构、Java类文件和Java API等关键技术。这些技术使得Java成为一种功能强大且易于使用的编程语言。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 如何使用Ping命令来测试网络连接?当网卡安装和有关参数配置完成后,可以使用ping命令来测试一下网络是否连接成功。以winXP为例1、打开XP下DOS窗口具体操作是点击“开始”菜 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • PostgreSQL 最新动态 —— 2022年4月6日
    了解 PostgreSQL 社区的最新进展和技术分享 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 由中科院自动化所、中科院大学及南昌大学联合研究提出了一种新颖的双路径生成对抗网络(TP-GAN),该技术能通过单一侧面照片生成逼真的正面人脸图像,显著提升了不同姿态下的人脸识别效果。 ... [详细]
author-avatar
mobiledu2502870067
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有