0*01 认识RN文件
- 前面有提到,新版的已经没有index.android.js和index.ios.js,默认生成的工程下有一个App.js和index.js,内容如下(注释是自己加的)
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from 'react'; //从react框架导入Component框架变量
import {
Platform,
StyleSheet,
Text,
View
} from 'react-native'; // 从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' +
'Shake or press menu button for dev menu',
});
type Props = {};// 以前的版本没有这个参数 一个属性集
// 定义一个名为App的类,继承了React组件
export default class App extends Component<Props> {
render() {
return (// 整个就是一个RN组件,通过render()返回的组件会被展示在屏幕上
// View是根视图,返回的组件只能有一个根视图
// style是View的属性,设置属性值为{styles.container} 这个值在下面styles中定义
<View style={styles.container}>
// 定义一个Text组件,设置属性
<Text style={styles.welcome}>
Welcome to React Native!
</Text>
<Text style={styles.instructions}>
To get started, edit App.js
</Text>
<Text style={styles.instructions}>
{instructions}
</Text>
</View>
);
}
}
// 定义属性集,有点类似一个集合类,每个item是一个属性集,每个属性是一个键值对
const styles = StyleSheet.create({
container: {
flex: 1, // 表示宽高会自动扩展
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10, //边距 单位pt?
},
instructions: {
textAlign: 'center',
color: '#333333', // 颜色值,可以设置rgba格式也可以设置英文
marginBottom: 5,
},
});
=================index.js文件===============
import { AppRegistry } from 'react-native';
import App from './App'; // 导入同文件夹下的App组件
// 注册这个组件
AppRegistry.registerComponent('LearnRN', () => App);
- RN的js文件和传统的js有点不同,被称为JSX,是JavaScript和XML的结合
- 首先从React框架中导入组件
- 从React-native框架中导入要用到的控件,用什么导入什么
- 定义一个类继承Component,重写render()方法,返回一个具体的组件(视图)
- <View> </View>表示一个具体的控件,在<>中设置这个控件的属性,在<></>中间的内容表示包含在这个视图中具体内容
- 定义控件的style
- 在index.js中导入创建的控件并注册。
ReactNative编辑器
- 根据操作系统和移动系统的不同,参考React Native 开发之 IDE 选型和配置。
- 个人使用Visual Studio Code 比较轻量
- 下载地址:https://code.visualstudio.com/
- 添加以下插件,就可以支持RN代码了
插件.JPG
ReactNative代码调试
使用chrome调试
- 打开chrome-->右上角三个点--> 更多工具--> 扩展程序-->搜索React Developer Tools。(正常是不会成功的)
- 目前各种chrome插件网站有提供该插件,但不确定是不是最新的,建议尽量使用科学上网的方式,登录chrome商店,搜索React Developer Tools下载。商店地址
- 关于科学上网,有这样一个新出的插件,大家可以试试插件下载地址
- 使用最新版RN并且安装了最新的React Developer Tools,使用命令行运行一次react-native run-android,项目正常运行后(会有两个命令行窗口,都不要关闭),摇一摇或者ctrl+m打开菜单,选择Debug JS Remote,会自动打开Google Chrome;
现有的版本,默认会设置反向,不需要自己输入tcp 8081什么的
- 打开后视图如下,直接按F12进入调试界面
rndebug.JPG
点击上方的sources查看源码,可以使用ctrl+p来搜索App.js,也可以直接在左侧搜索debuggerWorker.js,点开第一项就是App.js
根据需要设置断点,注意,此时reload断点会失效,所以目前只能测试可以调用方法的,即只能在运行后,进行点击或者输入之类的才能debug,如果是第一次初始化界面的,全部直接跳过。
右上方是正常的单步跳过、进入方法、跳出等调试常用方法。最右的圆形按钮,点击后可以设置pause on exception,出现异常就会自动断点,需要时可以打开。
- 初学者可能不知道怎么写方法,下面提供一个可以输入的界面,可以在updateNum方法中打断点测试。App.js代码如下
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/
import React, { Component } from 'react';
import {
Platform,
StyleSheet,
Text,
View,
AppRegistry,
Dimensions,
PixelRatio,
TextInput
} from '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' +
'Shake or press menu button for dev menu',
});
const {height,width} = Dimensions.get('window');
const pixelRatio = PixelRatio.get();
let widthOfMargin = Dimensions.get('window').width*0.05;
type Props = {};
export default class App extends Component<Props> {
constructor(props){
super(props);
this.state = {
inputNum:'',
password:''
};
}
updateNum(newNum){
this.setState((state) => {
console.log('update has been exec');
return {
inputNum:newNum,
};});
}
updatePW(newPW){
this.setState(
() => {
return {
password : newPW,
};
}
);
}
render() {
return (
<View style = {styles.container}>
<TextInput style = {styles.textInputStyle}
placeholder = {'请输入手机号'}
onChangeText = {(newNum)=>this.updateNum(newNum)}
/>
<Text style = {styles.textStyle}>
您输入的手机号:{this.state.inputNum}
</Text>
<TextInput style = {styles.textInputStyle}
placeholder = {'请输入密码'}
password = {true}
/>
<Text style = {styles.bigTextStyle}>
确定
</Text>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
// alignItems: 'center',
backgroundColor: '#F5FCFF',
},
textInputStyle: {
fontSize: 20,
textAlign: 'center',
backgroundColor: 'yellow',
margin: widthOfMargin,
},
textStyle: {
margin: widthOfMargin,
textAlign: 'center',
color: '#333333',
marginBottom: 10,
},
bigTextStyle:{
margin:widthOfMargin,
backgroundColor:'green',
textAlign:'center',
color:'red',
fontSize:30
}
});
界面如下:
使用VSCode进行调试
-
先在插件商店下载React Native Tools
-
点击左边的虫子,点击上面下拉箭头(不是绿色剪头),添加配置,默认会创建lauch.json,搜索React debug android,然后直接按默认配置即可。
vscodetoole.png
-
给App.js添加断点,在debug界面,点击绿色剪头(右边的名字就是在lauch.json中设置的名字),正常运行即可。
-
然而,如果你的插件版本是0.6.4,断点都不会成功,只会直接跳过 显示“未验证的断点,已设置断点但还未绑定”,目前这个问题已经被提交到vscode-react-native。应该是因为RN升级导致的不匹配,等待更新即可。
其他调试方式
- 使用console.error() 显示红屏警告,使用console.warn()显示黄屏警告
- 参见RN中文网 调试部分
建议:可以使用vscode编辑代码,使用chrome+RN Dev Tool断点调试,如果没有太大的问题,直接用console打印即可。
遇到断点调试,断点不能hit,直接运行的情况,基本上都是插件不匹配,或者没有更新,如果更新RN dev tool还不能解决的话,基本上就是个待解决issue了。
网友评论