React03 移动端跨平台开发
React-day03 RN移动端开发
了解React-Native
Facebook发起的开源的一套新的APP开发方案,Facebook在当初深入研究Hybrid开发后,觉得这种模式有先天的缺陷,所以果断放弃,转而自行研究,后来推出了自己的“React Native”方案,不同于H5,也不同于原生Native,更像是用JS写出原生应用
- 优点
开发成本小于Native模式 Andriod-Java-Kotlin IOS-OC-Swift
性能体验高于Hybrid
一次学习,跨平台开发Android和iOS, 小程序
社区繁荣
- 缺点
- 不同平台代码有所区别
- 开发人员学习有一定成本
- 几种开发技术对比 :应用质量和开发效率的平衡折衷的结果

了解React-Native工作流程
- 项目开发:使用Node初始化项目(需要安装Node),使用JavaScript/JSX语言开发
- 语言翻译:Python, C++将js翻译成java代码(需要安装Python2)
- 代码编译:Android-SDK将java编译成字节码(二进制),打包成可安装的apk(需要JDK8 & Android-SDK)
- 安装运行:通过Adb工具,把apk运行到Android模拟器
创建第一个React-Native项目 *
安装脚手架react-native-cli 同时安装新的版包管理工具
npm install -g yarn react-native-cli创建项目:doubanMovie(在不包含中文的目录执行)
react-native init xxx --version react-native@0.55.4运行项目
打开USB调试, 配置SDK
- ANDROID_HOME=G:\Android-SDK
- PATH=%PATH%;%ANDROID_HOME%\platform-tools
adb devices查看已连接设备
连接模拟器:
adb connect 127.0.0.1:62001更改gradle路径
doubanMovie\android\gradle\wrapper\gradle-wrapper.propertiesdistributionUrl值修改为file\:///E:/Lesson/bc1/React/day03/Resource/gradle-2.14.1-all.zip直接复制过来的路径要把反斜线\改成正斜线/
在项目根目录执行
react-native run-android运行期间会开启一个Node服务,不要关闭
第一次运行报错,需要在设备上设置app的Node服务地址
解决方式: 打开app > 菜单按钮 > Dev Settings -> Debug server host ...
填写服务ip和端口号, 注意冒号用英文半角,重启服务,重启应用
了解React-Native项目及结构
目录结构
- index.js 项目入口文件
- App.js 项目根组件,用户看到的首页组件
- package.json 项目配置文件
- app.json 配置项目名称
React-Native与React对比
组件写法
RN提供View,Text组件,没有html的dom元素
View -> div 布局容器
Text -> p 显示文字
样式写法
使用
const styles = StyleSheet.create({...})
React-Native平台相关代码处理
const instructions = Platform.select({
ios: 'Press Cmd+R to reload,\n Cmd+D or shake for dev menu',
android: 'Double tap R on your keyboard to reload,\n',
});
开发资料
- 官方文档
- 中文文档
- 技术博客
- 在github.com搜索react
- https://github.com/poplartang 在Stars 搜索React
项目开发
路由(react-native-router-flux)
react-native-router-flux
源码地址:https://github.com/aksonov/react-native-router-flux
应用场景:在RN项目中进行路由跳转时使用
安装方式:
yarn add react-native-router-flux使用:
Router(路由): 一般写在项目的根组件
Stack (栈):给Scene场景提供容器
Scene(场景):设置路由跳转规则
Actions (动作):触发路由跳转
const App = () => (
<Router>
<Stack key="root">
<Scene key="login" component={Login} title="Login"/>
<Scene key="register" component={Register} title="Register"/>
<Scene key="home" component={Home}/>
</Stack>
</Router>
);
注意事项:
最新版的react-native-router-flux会在react-native 0.55.4版本出现isMounted(...)警告,可在App.js添加以下代码忽略警告。随后两个框架更新后,此警告也可消除。
import { YellowBox } from 'react-native'
YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated'])
触发路由:三种方式 (注意导入Actions组件)
<Text onPress={Actions.movieList}>电 影</Text>
<Text onPress={() => { Actions.movieList()}}>电 影</Text>
<Text onPress={() => { Actions['about'].call() }}>关 于</Text>
开发组件(swiper)
开源轮播图react-native-swiper
源码地址:https://github.com/leecade/react-native-swiper
应用场景:在首页展示轮播图
安装方式:
yarn add react-native-swiper常用属性:
index={1} 默认位置, 从0开始
showsButtons={true} 是否显示按钮
autoplayTimeout={2.5} 自动播放停留时间
autoplay={true} 是否自动播放
showsPagination={true} 显示分页指示器
网络请求(fetch) *
- Axios
- fetch
- 在
componentDidMount执行请求并在回调中执行setState// 组件已经挂载
componentDidMount() {
const url = 'http://api.douban.com/v2/movie/in_theaters';
fetch(url).then(res => res.json())
.then(data => {
// 处理网络json数据
this.setState({
isLoading: false,
movieList: data.subjects
})
// console.warn(data.subjects)
}).catch((err) => {
console.error(err);
});
}
长列表(FlatList) *
长列表优化
<FlatList
data={this.state.movieList}
keyExtractor={(item, index) => item.id}
renderItem={({ item, index }) => {
return (
<View style={{ padding: 10, flexDirection: 'row' }}>
<Text>{item.title}: {item.year} : {index} </Text>
</View>
)
}}
/>
加载指示器
<View style={{ flex: 1, padding: 20 }}>
<ActivityIndicator />
</View>
条目点击跳转
Actions.movieDetail({ "movieId": movie.id, "movieTitle": movie.title});
滚动视图(ScrollView)
- 发送网络请求
- 渲染视图
日志与调试
查看RN日志:
react-native log-ios
react-native log-android
android也可在PC控制台输入
adb logcat *:S ReactNative:V ReactNativeJS:V
应用内的错误与警告
console.warn('Yellow.');
console.error('Red.');
Debug调试
- Chrome开发者工具
在Android设备菜单中选择“Debug JS Remotely”,PC会自动通过Chrome浏览器打开调试页面 http://localhost:8081/debugger-ui (需要自行安装Chrome)。这里注意自动打开的主机地址可能不是localhost,需要手动改成localhost (不修改,则手机页面可能是空白)
在Chrome浏览器按
Ctrl + Shift + I或F12打开控制台选中Sources选项卡 -> Network标签 -> debuggerWorker.js 打开指定组件文件即可
如果没有没有debuggerWorker.js, 查看页面最下边的Status提示。
Status: Another debugger is already connected
另一个调试器已连接,直接使用或关闭那个调试器
Status: Waiting, press Ctrl R in simulator to reload and connect.
等待中,建议重新加载模拟器
可以在代码中打断点,Console中执行js代码打印变量、执行脚本
关闭调试:在Android设备菜单中选择“Stop Remote JS Debugging”即可
打包及发布
参见中文官网文档:https://reactnative.cn/docs/0.51/signed-apk-android.html#content
多端统一开发框架:https://github.com/NervJS/taro 生成能运行在微信小程序、H5、React Native 等的应用
修改图标
- [项目名称]\android\app\src\main\res\mipmap-xhdpi
今天所有安装的包
react-native-router-flux 路由
应用场景:在RN项目中进行路由跳转时使用
安装方式:
yarn add react-native-router-fluxreact-native-swiper 开源轮播图
应用场景:在首页展示轮播图
安装方式:
yarn add react-native-swiper
React03 移动端跨平台开发的更多相关文章
- JSBridge框架解决通信问题实现移动端跨平台开发
一.跨平台开发是趋势 目前主流的移动端平台主要是Android和iOS,为了尽可能复用代码和节省开发成本,各大巨头都开发了自己的跨平台框架,比如Facebook的React-Native.阿里的Wee ...
- 移动端跨平台方案对比:React Native、weex、Flutter
跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架百花齐放,颇有一股推倒原生开发者的势头. 为什么我们需 ...
- 最火移动端跨平台方案盘点:React Native、weex、Flutter
1.前言 跨平台一直是老生常谈的话题,cordova.ionic.react-native.weex.kotlin-native.flutter等跨平台框架的百花齐放,颇有一股推倒原生开发者的势头. ...
- 跨平台移动端APP开发---简单高效的MUI框架
MUI是dcloud(数字天堂)公司旗下的一款跨平台开发移动APP的框架产品,在学习MUI框架之前,最先接触了Hbuilder代码编辑器,它带给我的第一感觉是快,这是HBuilder的最大优势,通过完 ...
- 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...
- 移动端IM开发需要面对的技术问题
1.前言 这两年多一直从事网易云信 iOS 端 IM SDK的开发,期间不断有兄弟部门的同事和合作伙伴过来问各种技术细节,干脆统一介绍下一个IM APP的方方面面,包括技术选型(包括通讯方式,网络连接 ...
- Flutter 实现原理及在马蜂窝的跨平台开发实践
一直以来,跨平台开发都是困扰移动客户端开发的难题. 在马蜂窝旅游 App 很多业务场景里,我们尝试过一些主流的跨平台开发解决方案, 比如 WebView 和 React Native,来提升开发效率和 ...
- 利用Delphi-cross-socket 库提升kbmmw 跨平台开发
以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...
- 浅谈移动应用的跨平台开发工具(Xamarin和React Native)
谈移动应用的跨平台开发不能不提HTML5,PhoneGap和Sencha等平台一直致力于使用HTML5技术来开发跨平台的移动应用,现在看来这个方向基本算是失败的,基于HTML5的移动应用在用户体验上与 ...
随机推荐
- 20145238-荆玉茗 《Java程序设计》第9周学习总结
20145238第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...
- vector的几种初始化和遍历
随着C++11标准的出现,vector出现了新的初始化和遍历用法,但是vs2010和较高版本并没有能完全支持C++11标准,所以我就将它的所有的用法归纳了一下. vector的初始化 vector基本 ...
- 3.Netty的粘包、拆包(二)
Netty提供的TCP数据拆包.粘包解决方案 1.前言 关于TCP的数据拆包.粘包的介绍,我在上一篇文章里面已经有过介绍. 想要了解一下的,请点击这里 Chick Here! 今天我们要讲解的是Net ...
- NestedScrollView和RecyclerView使用,并设置间距
NestedScrollView和RecyclerView使用,并设置间距: 效果图如下: 1.NestedScrollView 和RecyclerView嵌套问题(类似ScrollView 和lis ...
- python 生成器与迭代器(yield 用法)
背景 首先,我不会解释这两个名词,我看过很多遍解释,可还是看不懂,还是直接看使用情景吧. 我们以佩波拉契数列为例,当我们不知道迭代器的情况下,我们写出来的代码可能是这样子的: '''这种方式计算fib ...
- java乱码问题
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- Spring Boot Shiro权限管理--自定义 FormAuthenticationFilter验证码整合
思路shiro使用FormAuthenticationFilter进行表单认证,验证校验的功能应该加在FormAuthenticationFilter中,在认证之前进行验证码校验. 需要写FormAu ...
- pip安装第三方包总失败
第一步:升级pip python -m pip install -U pip 第二布:安装想下载的第三方包 python -m pip install xx 一般来说pip安装不会失败的,失败的话就尝 ...
- 【PGP公钥】
Fingerprint: 37AF 3814 3ABC 5DFA 97F5 300E 581D A2E3 F4D2 F585 Key ID:0x581DA2E3F4D2F585 -----BEGIN ...
- nuxt generate静态化后回退问题
之前线上的项目是nuxt build后的项目发布在服务器上,pm2来管理node的进程,nuxt还是运行在node的环境里. 这个方案用了半年左右,访问速度什么的确实很快,pm2管理下的node在wi ...