美文网首页React NativeiOS 实用技术React Native
高仿美团客户端 React-Native版,支持iOS、Andr

高仿美团客户端 React-Native版,支持iOS、Andr

作者: 猿类素敌 | 来源:发表于2017-04-17 15:17 被阅读15574次

美团客户端

视频教程

现已推出全套视频教程,从创建工程讲起,一行一行编写代码,直至完成整个项目。
腾讯课堂
网易课堂

Github:https://github.com/huanxsd/MeiTuan
简书:http://www.jianshu.com/p/9211f42d5c25

iOS截图

iOS_0.png iOS_1.png iOS_2.png

Android截图

Android_0.png Android_1.png Android_2.png

简介

这是一个用React-Native写的美团客户端。
主要实现了美团的四个一级页面(团购、附近、订单、我的),以及部分二级页面(团购详情、Web页面)。
所有功能都是用JavaScript写的,iOS和Android的代码复用率达到了97%(别问我这个数字怎么来的,我瞎掰的)。
这个Demo的静态类型检查工具使用了Facebook的Flow。它让我写JavaScript的时候,更有安全感。个人觉得可以用两个字形容这个工具,那就是:灰常牛逼!
我试着让这个Demo的结构尽量接近实际项目,同时使用比较简单方式去实现功能。这样可以让刚接触ReactNative的人(比如我自己...)更够容易理解代码。
所有的JS代码都在src目录下。
目录结构


Paste_Image.png
  • common
    通用的工具类
  • img
    所有图片资源
  • scene
    所有场景
  • widget
    通用的UI控件
  • api.js
    网络请求的接口
  • RootScene.js
    App的主入口,类似iOS中的RootViewController

该项目没有使用Redux。因为个人觉得目前大部分的中小型App并不需要Redux。如果盲目的将Redux添加到项目中,并不能带来太多的益处。
鲁迅曾说过:

"如果你不知道是否需要 Redux,那就是不需要它。"

Redux的作者 Dan Abramov 说过:

"只有遇到 React 实在解决不了的问题,你才需要 Redux 。"

哦,另外一个没有用Redux的原因,是我还不太会用。

App的页面跳转、TabBar、Navigation,全部通过react-navigation实现。这是一个非常牛逼的库,可以实现很多自定义的跳转功能。最早是通过react-native-router-flux实现跳转。在遇见react-navigation后,我果断放弃了react-native-router-flux。

App中很多页面都使用了同一个网络接口,这不是为了让代码更加简洁,仅仅是我偷懒 >.<

第三方依赖

安装

  1. Clone the repo
$ git clone https://github.com/huanxsd/MeiTuan.git
$ cd MeiTuan
  1. Install dependencies (npm v3+)
$ npm install
  1. Running on iOS
$ react-native run-ios

常见问题

Could not connect to development server

打开新的terminal窗口,并执行:

$ react-native start

瞎扯蛋

我之前一直在写Objective-C,但不久前看了ES6的语法和Flex布局方式后,我便马上爱上了这种开发方式。
这个Demo花了大概5天时间,是我的第一个ReactNative项目。
如果对这个Demo有任何的意见或建议,或者喜欢ReactNative的朋友,欢迎在下方留言。我会在第一时间回复 :)

最后

如果你喜欢这个Demo,请给我一个star :)
Github:https://github.com/huanxsd/MeiTuan
我将持续更新这个Demo

更多阅读

LinkMap解析工具:检查每个类占用大小
最灵活的UI控件库:React Native UI Lib
React Native开发实用技巧
基于FlatList的上拉、下拉刷新组件

ReactNative交流群

ReactNative开发者群二维码.png

相关文章

网友评论

  • Mr_Darker:问下run-android Error: Activity class {com.meituan/com.meituan.MainActivity} does not exist. 是什么原因啊
  • haiifeng:棒棒哒!!!!
  • 5e9f6e38171f:大佬可以解释下为什么果断放弃react-native-router-flux吗?
    猿类素敌:@Up_47fc react-navigation是rn官方推荐的,个人觉得react-navigation的api设计的也比react-native-router-flux合理
  • Archy_15c8:出现错误 Unhandled JS Exception: Can't Find variable:process(http://localhost:8081/index.bundle?platform=ios&;dev=true&minify=false:1295)
    这怎么解决啊
  • c0db5a4e8e94:按照你的结构搭了rootScene,为什么子页面不能自定义导航栏呢?比如在homeScene里设置了标题无效
  • 小天使999999:discount这个接口返回的是空数据
  • 就是一个春天的花朵:discount这个接口是不是挂了啊
    小天使999999:直接官网找啊,我也是自定义的,TabNavigation效果很好
    就是一个春天的花朵:@猿类素敌 还有一个问题, 我按照你的代码自定义了首页navigationbar, 发现没有作用, 排查之后发现我用的react-navigation版本已经到了 2.0, 而你的工程里的还是1.0.0 beta, :joy: 请问你知不知道2.0版本的如何自定义navigation bar, 谢谢
    猿类素敌:是啊 挂了。。:joy:
  • kled_net:你好,如果在 item 详情中再点击 item ,这样会有很多层,怎么在返回的时候直接返回到主页,而不是返回到上一个 item 的详情页面?
    码字农民工:@rootV 重新跳转到首页,并且重置navigation的路由
  • 红枫叶HM:打开应用首页会提示:SyntaxError: JSON Parse error: Unrecognized token '<', 是我本地的环境不对吗?
  • 壮志灵云:请问下,视频里第八节,美团的接口返回为空怎么解决呢
  • Skyling:相见恨晚
  • RicoX2016:这个Demo花了大概5天时间 真够牛逼的,感谢分享
  • a637237315f9:多谢分享
  • 2b1ed5b649ed:React Native最低支持iOS什么版本了 ?
    猿类素敌:@七夜_ 最新的RN是支持到iOS 8
  • 走在路上的程序员:你好 我这边因为出现 Android中出现Error:Unable to find module with Gradle path ':@remobile/react-native-datetime-picker' (needed by module 'app'.)这个Error。我修改了gradle版本也不好使,查看到settings.gradle和app的build.gradle都有react-native-image-picker这个。这个问题应该怎么解决呢。
  • 58a2a6758648:我打包apk,安装运行后直接崩溃闪退,报错undefined is not an object (evaluating 'o.View.propTypes.style'),开发环境运行是正常的,google了很久一直没找到原因,不知道您遇到过吗
  • 藉口i:好厉害啊,五天。
  • 404http:至于redux,确实很多装逼的在那跟风,搞的本来就一个很简单的需求非要用上了redux,代码逻辑搞得东一陀西一陀,后续如果谁接手维护他的代码,估计他会被骂死,对于redux,我表示略懂一点,项目需求交互这些很简单,确实没用到过,也就没去深入了解o(∩_∩)o
  • 4541faff9624:我用ios跑git上的代码可以的,换android后就会报错:
    undefined is not a function(evaluating 'arr[typeof Symbol ==="fnction" ? Symbol.iterator:"@@iterator"]()'
  • xxsasc:老哥,window怎么运行react native啊,没有苹果电脑但想搞 能教教我吗?
  • 小小程序员jh:楼主你这个demo仅仅花了5天的时间就完成了?
  • 無漾:2524 http fetch GET 304 https://registry.npm.taobao.org/js-yaml 331ms (from cache)
    2525 silly fetchPackageMetaData error for js-yaml@^3.7.0 Unexpected end of input at 1:24865
    2525 silly fetchPackageMetaData a":"^2.6.0"},"devDependencies":{"ansi":"*","benchmark":"*","browserif
    2525 silly fetchPackageMetaData ^
    2526 verbose stack SyntaxError: Unexpected end of input at 1:24865
    2526 verbose stack a":"^2.6.0"},"devDependencies":{"ansi":"*","benchmark":"*","browserif
    2526 verbose stack ^
    2526 verbose stack at Object.parseJSON (/usr/local/lib/node_modules/npm/node_modules/pacote/node_modules/make-fetch-happen/node_modules/node-fetch-npm/node_modules/json-parse-helpfulerror/node_modules/jju/lib/parse.js:745:13)
    2526 verbose stack at parse (/usr/local/lib/node_modules/npm/node_modules/pacote/node_modules/make-fetch-happen/node_modules/node-fetch-npm/node_modules/json-parse-helpfulerror/index.js:10:13)
    2526 verbose stack at consumeBody.call.then.buffer (/usr/local/lib/node_modules/npm/node_modules/pacote/node_modules/make-fetch-happen/node_modules/node-fetch-npm/src/body.js:96:50)
    2526 verbose stack at <anonymous>
    2526 verbose stack at process._tickCallback (internal/process/next_tick.js:188:7)
    2527 verbose cwd /Users/zhangdongdong/MeiTuan
    2528 verbose Darwin 16.7.0
    2529 verbose argv "/usr/local/Cellar/node/8.2.1/bin/node" "/usr/local/bin/npm" "install"
    2530 verbose node v8.2.1
    2531 verbose npm v5.3.0
    2532 error Unexpected end of input at 1:24865
    2532 error a":"^2.6.0"},"devDependencies":{"ansi":"*","benchmark":"*","browserif
    2532 error ^
    2533 verbose exit [ 1, true ]
  • 無漾:您好,我去npm install时报错。
    無漾:npm ERR! Unexpected end of input at 1:24865
    npm ERR! a":"^2.6.0"},"devDependencies":{"ansi":"*","benchmark":"*","browserif
    npm ERR!
  • 萨瓦迪卡123456:要是用了redux,代码还可以深究下,没redux不行啊
  • 唯有她美:更新不断,不要停
    唯有她美:@Daniel_1024 是加进去程序出现问题了吗?如果只是难理解,程序复杂了,请不要断了更新,react的实例项目真的不太多,加油!!!
    猿类素敌:可能要停了哈,发现把最近写的代码加进去的话,代码会变得不好理解了
  • allen_ge:不错,请继续你的表演:smile:
  • 还没想到叫什么:问一下楼主有没有遇到过一个问题,从一个listview的页面跳转到下个界面之后,又回到listview的页面时候item全部不见了,必须你手动滑一下页面数据又重新展示出来了,这是什么情况呢?
  • 4f4b7cfaf911:api.meituan.com 地址链接不上了
  • 6da1d5d22310:支持,向作者学习。
  • dc0db66b3d58:有几个问题想请教一下
    1、RefreshListView的startHeaderRefreshing()中 this.props.onHeaderRefresh && this.props.onHeaderRefresh() 前面容易理解调用的是父组件传过来的方法,后面的是调用的是自己的方法,为什么不用this而是用this.props?
    2、NearbyListScene 中
    listView: ListView
    .....
    componentDidMount() {
    this.listView.startHeaderRefreshing();
    }
    this.listView不是ListView组件类型么,该类型没有这个方法,怎么能调用RefreshListView的startHeaderRefreshing()方法?
  • 青伢子:开发工具建议用 web storm有插件集成度高。我一个晚上搞定开发环境个demo.第一次接触rn,一以前搞php的。
  • 黑夜漫步:厉害了,Word哥
  • sun_xin:遇到的问题和这个相同 http://ask.csdn.net/questions/340629
  • sun_xin:我的运行环境是win7
  • sun_xin:你好, 我执行npm start 命令行后 http://localhost:8081/index.android.bundle?platform=android
    返回404 怎么回事?
  • 21fe789340c5:请问楼主有RN和JS学习路线吗?感觉你做的东西好棒,我也想跟着学习
    猿类素敌:我是跟着RN官网的文档学
  • 张大娃创业笔记:我想问一下,为何我用react navigation做的tabbar然后首页里面使用react-native-scrollview-tab却不能显示对应的页面呢,又没报错还可以滑动,就是不显示页面内容,所以我想请教一下大师知道怎么解决吗?
    张大娃创业笔记: @孤影追忆 打开新页面后返回立马就显示了
    张大娃创业笔记: @孤影追忆 不是,但我看你的项目里也使用了啊,怎么没被tabber覆盖
    猿类素敌:@孤影追忆 没遇到过这种情况,是我这个demo里的吗?不是的话,可以去react-native-scrollview提个issue
  • 6d3bec729dff:react-navigation 如何去掉导航栏呢?真正项目中有些页面是不需要导航栏的
    猿类素敌:@Start将军
    static navigationOptions = ({ navigation }) => ({
    header:null
    })
  • 沧梦无痕:初学者问个问题:为什么宽度高度写死?不用适配吗
    猿类素敌:@沧梦无痕 你是指哪里的宽度高度写死呢?
    部分图片的高度和宽度的逻辑点是写死的,在不同设备上渲染的时候,会自动换算成像素点。
  • qxMwTh:有兴趣来真·美团看看么?
    qxMwTh:@Daniel_1024 哈哈了解~我也是福州人
    猿类素敌:谢谢呀,目前只考虑福州的公司
  • a57fb4760d5c:有没有用到日历,
    猿类素敌:没有的
  • 6d3bec729dff:listview快速点击的时候 新页面会弹出多个
  • okdyp:vs code 怎么设置,我会有这样的提示:
    [js]types can only be used in a ts file
    猿类素敌:这是因为用到了flow,在vs code的设置里关掉js代码检查即可
    "javascript.validate.enable": false
  • 未完待旭:直接react-native init 了一个项目,初始化到了最新的0.43.4,之后再引入你项目中的react-native-router-flux和react-native-scrollable-tab-view。产生了不少依赖冲突。主要是react和react-native的依赖冲突。请问 @Daniel_1024 ,平时开发中这类依赖,你是怎么权衡版本?是否有遇到要依赖某个第三方控件的时候,和自己已经开发很久的基础依赖包冲突了。
  • woodfox:非常棒,简单实用,比 Ignite 这类 boilerplate 好多了!
  • 瑟荻:想问下APP里面的数据从哪来的 美团的API似乎不是开放的啊
    _东阁堂主_:兄弟,你真厉害,准备研究你的代码,写点感受,最近也在看React ,但是看的云里雾里,现在真好,可以研习一下你(大神)的代码。
    猿类素敌:@瑟荻 接口是google上搜的,有人去抓包
  • iT_lijun:hi 已经成功运行MeiTuan... 另外 前辈有没有运行过f8app? 我在win 10环境下搞了很久都没法运行起来 f8app: https://github.com/fbsamples/f8app
    猿类素敌:@iT_lijun node 7.4.0, react-native 0.42.3,安卓的gradle不太了解哈,我之前是做iOS的
    iT_lijun:@Daniel_1024 对了,前辈的node 和react-native版本是?另外还有问题就是,当git clone它人的项目后...到了react-native run-android,因为项目gradle版本和本机默认gradle版本不同的时候,又要耗费大量时间去下载gradle和相关的一堆jar等文件....没试过修项目的gradle版本,不晓得会不会有影响:joy:
    猿类素敌:@iT_lijun 我在mac上可以正常运行的。编译过程中报错,把报错信息贴google上,有很多解决方法的
  • go_mars:持续更新,不要停
    猿类素敌:@go_mars YOYO 根本停不下来~
  • 4b01863fd657:很不错 支持一下
  • 十一岁的加重:现在 js还能用吗
  • 韩大熊宝要姓张:需要很牛逼的 js功底么?
    猿类素敌:@韩大熊宝要姓张 不用的,我也是刚学js
  • smartphp:绝对不是盲目推崇redux.这个弯不好转。react就是状态机,怎么根据state来执行渲染,执行交互。是采用中间人统一处理,还是组件自己管理。这是个值得深入思考的问题。要用redux要转变state管理的观念。使用redux以后,app的应用逻辑就集中在redux中了。redux-saga中的数据流操作方法,等你吃透了就在也离不开了。现在就还没学就开始排斥redux,redux-saga是非常不明智的。
    smartphp:https://medium.com/dailyjs/11-mistakes-ive-made-during-react-native-redux-app-development-8544e2be9a9 看一下这篇文章
    猿类素敌:@smartphp 感谢回复
    我赞成复杂的项目用redux,肯定会方便很多
    对于简单的项目,个人觉得代码简洁易读是排在第一位。
    redux强制分了view,action,reducer。对于简单的逻辑,个人觉得没有必须.
    正如mvc可以轻松应对的事情,没有必要用mvvm一样
  • smartphp:开发就根本没有简单流程一说。就登录过程改变的状态就就有好几个。引入redux,redux-saga才是明智之选。你的数据如果是直接用mock数组导入的就给简单。你把这些数据放到mock-server,你再考虑问题就没有那么乐观了。
    猿类素敌:@smartphp demo中的列表数据是直接走美团真实接口的。个人还是觉得中小型app,用redux不一定就好。就像ios不一定非要用rac一样,解决方案非常多,现在很多人盲目推崇redux了
  • 晨曦之光nl:可以试试用Vue.js写,这个目前很火
    猿类素敌:@一一抛到银河 嗯 说错了 是基于vue的weex
    一一抛到银河:完全不是一个东西阿 大哥, Vue.js是HTML5,这是用RN 通过JS渲染原生阿
    猿类素敌:vue没接触过,据说可以一份代码同时跑ios、android、浏览器。不过个人更偏向于RN,因为目前RN的社区更活跃,可能更安全一些
  • 7c78a9d8ace3:我滴哥。问一下。就是RN中只有listview组件,那如果要实现网格布局的gridview有什么好的办法么?我自己按照网上说listview布局换行。这样是可以实现网格。但会出现问题,比如一行2个。我有7行数据,那么必然最后一行会多出一个item,这个时候我在添加上拉加载或footed布局时。这个footed布局就会当成item填充到listview的item中。导致界面会很丑。不知道对于,网格gridview的上拉加载功能你是怎么实现的。或者有什么思路。我是刚接触RN的小白。。。
    7c78a9d8ace3:@Daniel_1024 这个解决不啊。遇到九宫格类型的布局还是一样的问题。就是尾部布局错位混乱
    猿类素敌:试一下将你的footer放在renderFooter方法中
    可以参考下这个类的实现,不知是否可以解决你的需求
    https://github.com/huanxsd/MeiTuan/blob/master/src/widget/RefreshListView.js
  • liuzhongyi:请问开发这个用的什么开发工具?我现在在用HBulider,打开开了一下两者不一样。
    MiBoy:@liuzhongyi webstorm
    liuzhongyi:@Daniel_biu_biu 可以用HBulider这个工具
    猿类素敌:只要装了ReactNative环境,开发工具没要求的。我是用visual studio code
  • 张大娃创业笔记:我运行安卓端,打开页面非常卡顿怎么回事
    张大娃创业笔记: @Daniel_biu_biu 打开新页面
    猿类素敌:@孤影追忆 是底部的tabbar切换卡,还是push到新页面卡呢?还是说进所有页面都卡?
    张大娃创业笔记: @孤影追忆 其他都不错,就是打开新页卡顿有点严重
  • 小新先生爱捣乱:楼主 我发现RN开发的东西 只能和电脑在一个网络才能出现内容么,如果要改只能把js放到服务器上面去么
    勇敢的呆喵:@Daniel_1024 请问这样的话 还能做到不发新版改线上bug吗? 我理解这么做是直接把js打包到ipa包里了, 不能再动态改动了,求大神解答
    猿类素敌:也可以把js代码打包成jsbundle,放在app的安装包里的
    react-native bundle --entry-file index.ios.js --bundle-output ./ios/index.ios.jsbundle --platform ios --assets-dest ./ios --dev false
  • 03e2038c5a8f:如何导出Apk和ipa包呢?
    猿类素敌:跟其他RN导出方式一样的
    http://reactnative.cn/docs/0.43/running-on-device-ios.html#content
    http://reactnative.cn/docs/0.43/running-on-device-android.html#content
  • 5ec1da87f063:孔子曰:"鲁迅说的对"

本文标题:高仿美团客户端 React-Native版,支持iOS、Andr

本文链接:https://www.haomeiwen.com/subject/mkptzttx.html