移动指的是移动设备平台, app 是应用 (application) 的缩写, 移动App就是移动设备上运行的应用程序
Native App 性能体验好,Hybrid App 开发维护成本低。你可能会想,如果有一种技术能够同时拥有两者的优点就好了,facebook 公司的 ReactNative 因此而生,它使用js和React编写UI逻辑,然后生成原生控件进行渲染绘制,既拥有媲美原生应用的性能体验,又拥有混合应用跨平台、开发快等优点。
当然这也不是绝对的,在特殊需求下,还是会有不足。首先框架本身需要处理大量平台相关的逻辑,随着系统与API的升级变化,开发者有可能也需要处理平台之间的差异,甚至有些特性只能在部分平台上实现,从而降低跨平台性。当然,这些问题也会随着 ReactNative 的版本迭代逐渐改善。
安装个环境感觉在开武林大会一样…
npm install -g create-react-native-app
当然什么node环境;cnpm;yarn什么的再这里就不说;保存我的内力…
# create-react-native-app version: 2.0.2
create-react-native-app --version
create-react-native-app projectName
2. 输入enter选择blank
创建一个空项目;输入项目名字name
;这里我输入project;然后回车
3. 是否使用yarn;这里自行选择;我输入Y然后回车
4. 好了项目开始创建了(我有时候他没有帮我安装包;自行输入yarn add
安装下包即可即可)
5. expo start
cd project
expo start
# 看到二维码即是成功
npm install -g yarn react-native-cli
Expo development tools
因为我用得是安卓和window;所以mac我就不去深究了…这里以vscode软件进行开发
因为在我不断的摸索下;终于找到个不用到GooglePlay商店;第一到谷歌商店你要先过去;然后注册账号密码;最后你经过一系列的斗争;你还是没有安装成功;它告诉你没有设备…所以点击这个连接;它是一个蓝色图标expo(但是最后可能不行;没事我们一步步来)所以先用这个试试:Download APK2.2.0
使用expo(安装在手机上)扫描一下二维码;当然在自动打开的浏览器也有–点击LAN即可访问
有报这些什么Something went wrong Could not load exp://192.168.56.1:19000 Network response timed out.
;反正就是不能加载问题。我们直接查ip;有很多方式可以查;这里以vscode为例子–点击最右边的+
直接添加一个新的终端;输入ipconfig
或则你使用cmd;或则直接打开网络共享中心查看详细信息都可以。ip冲突主要可能是你装了虚拟机或则是你使用了安装了安卓模拟器,而模拟器需要virtualBox;一般都是比如以太网IP、虚拟IP、无线局域网IP等
这个很好解决;ctrl+C停掉;设置一下
set REACT_NATIVE_PACKAGER_HOSTNAME=my-custom-ip-address-or-hostname
这里我是这样设置的
set REACT_NATIVE_PACKAGER_HOSTNAME=192.168.0.106
"sdkVersion": "31.0.0"
;重新启动;结果还是不行的话;找其它版本软件这个是另一个版本expo软件…
如没有的话加入前端交流群:749539640获取
其它一些问题比如ip错误看上面即可;报错这个如下(因为我是用最新的版本32.0.0)
"sdkVersion": "31.0.0",
重新启动;或则你将脚手架create-react-native-app
退到之前的版本React Native 0.55.4
试一试
然后界面出现一下一句话;这个时候就想阿基米德发明浮力定律;很想裸奔;因为安装成功了
Open up App.js to start working on your app!
搭建开发环境: https://reactnative.cn/docs/getting-started.html
adb安装在Android-sdk路径下的platform-tools目录,这个工具是电脑与Android设备进行通信的通用命令行工具,同时可以检测或连接Android设备,所有有几个常用命令需要了解。
将来使用的时候需要保证本机的adb版本需要与Android设备内的adb版本一致,否则可能无法正常通信,解决办法是我们可以复制本机的adb.exe程序,然后覆盖掉模拟器中的版本。
有了开发环还需要一款手机作为运行环境,除了使用真机外,还可以使用模拟器软件进行替代。Window平台下官方推荐使用一款叫Genymotion的Android模拟器,该模拟器依赖VirtualBox虚拟机,需要创建账号登陆后才能使用,除此以外也可以使用国内模拟器,国内模拟器比较多,有夜神、雷电、MuMu等。
import React, { Component } from 'react';
import { Text, View } from 'react-native';
export default class HelloWorldApp extends Component {
render() {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>Hello, world!</Text>
</View>//类似 html 中的div或是span这样的容器。
);
}
}
在编写 React Native 应用时,肯定会写出很多新的组件。而一个 App 的最终界面,其实也就是各式各样的组件的组合。组件本身结构可以非常简单——唯一必须的就是在render方法中返回一些用于渲染结构的 JSX 语句。
View里面不能写文本;因为开发工具有些不稳定;所以如果代码写错;可能会直接崩溃掉,例如View里面直接写了文本:
import React, { Component } from 'react';
import { Text, View } from 'react-native';
export default class HelloWorldApp extends Component {
render() {
return (
<View>Hello,world! </View>
);
}
}
<Text style={{ color:"red" }}>
<Text>啦啦啦</Text>
<Text>我是卖报的小画家</Text>
<Text>我是行内元素,一行显示!!!</Text>
</Text>
这里所有的文字都是一行显示;字体为红色
3. 如果我们把它改为View;
return (
<View style={{ color:"red" }}>
<Text>啦啦啦</Text>
<Text>我是卖报的小画家</Text>
<Text>我是行内元素,一行显示!!!</Text>
</View>
);
我们使用View之后;发现红色字体样式没有显示出来;也就是没有继承了。而且还分三行。因为View的子元素默认是纵向排列的,即便放置的是Text内行元素也是这样;那么因为RN对块级元素默认采用的是flex布局,而且是纵向排列的。
RN代码运行时会把错误分为红屏和黄屏两种,红屏会以全屏红色显示在应用中,导致程序无法正常运行,红屏通常是编码错误导致的,必须修复。比如上面错误的代码
render() {
return (
<View>
<Text>Helloworld!</Text>
</View>
);
}
黄屏代表警告,会显示在应用下方,不影响程序运行,不修复也可以,警告可以通过代码禁止。
// 频闭黄色警告,参数为一个数组:数组中的字符串就是要屏蔽的警告的开头的内容。
YellowBox.ignoreWarnings(['Warning: ']);
import React, { Component } from 'react';
import { Text, View, StyleSheet, Button } from 'react-native';
export default class ButtonStudy extends Component{
constructor(props){
super(props)
this.state = {
count: 0
}
}
render (){
return (
<View style={ styles.container }>
<Text>{this.state.count}</Text>
<Button title="点我!" onPress={ this.increment.bind(this) }></Button>
</View>
)
}
increment(){
this.setState({
count:this.state.count+1
})
}
}
const styles = StyleSheet.create({
container: {
display: "flex",
alignItems: "center"
}
});
import React from 'react';
import { View, Image, StyleSheet } from 'react-native';
export default class ImageStudy extends React.Component {
render(){
return (
<View>
<Image style={styles.img} source={require('../assets/splash.png')}/>
</View>
)
}
}
let styles = StyleSheet.create({
img: {
width: 55,
height: 55
}
});
如果是通过uri载入的网络图片,必须要设置宽高,否则无法显示
<Image
style={{width: 50, height: 50}}
source={{uri: 'https://facebook.github.io/react-native/docs/assets/favicon.png'}}
/>
https://reactnative.cn/docs/components-and-apis/
可以每一个按照文档去试一下…先到这里