热门标签 | 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


推荐阅读
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • 微信商户扫码支付 java开发 [从零开发]
    这个教程可以用作了解扫码支付的整体运行过程,已经实现了前端扫码,记录订单,回调等一套完整的微信扫码支付。相关链接:微信支 ... [详细]
  • 寻求更强大的身份和访问管理(IAM)平台的企业正在转向云,并接受身份即服务(IDaaS)的灵活性。要为IAM选择正确的场外解决方案,业务管理人员和IT专业人员必须在实施之前评估安全 ... [详细]
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社区 版权所有