美文网首页ReactNative学习记录
01 ReactNative 初始文件分析、IDE和调试

01 ReactNative 初始文件分析、IDE和调试

作者: 与之书 | 来源:发表于2018-03-11 19:31 被阅读145次

    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的结合
    1. 首先从React框架中导入组件
    2. 从React-native框架中导入要用到的控件,用什么导入什么
    3. 定义一个类继承Component,重写render()方法,返回一个具体的组件(视图)
    4. <View> </View>表示一个具体的控件,在<>中设置这个控件的属性,在<></>中间的内容表示包含在这个视图中具体内容
    5. 定义控件的style
    6. 在index.js中导入创建的控件并注册。

    ReactNative编辑器

    1. 下载地址:https://code.visualstudio.com/
    2. 添加以下插件,就可以支持RN代码了
      插件.JPG

    ReactNative代码调试

    使用chrome调试

    1. 打开chrome-->右上角三个点--> 更多工具--> 扩展程序-->搜索React Developer Tools。(正常是不会成功的)
    2. 目前各种chrome插件网站有提供该插件,但不确定是不是最新的,建议尽量使用科学上网的方式,登录chrome商店,搜索React Developer Tools下载。商店地址
    3. 关于科学上网,有这样一个新出的插件,大家可以试试插件下载地址
    4. 使用最新版RN并且安装了最新的React Developer Tools,使用命令行运行一次react-native run-android,项目正常运行后(会有两个命令行窗口,都不要关闭),摇一摇或者ctrl+m打开菜单,选择Debug JS Remote,会自动打开Google Chrome;

    现有的版本,默认会设置反向,不需要自己输入tcp 8081什么的

    1. 打开后视图如下,直接按F12进入调试界面
      rndebug.JPG
    rn debug2.png

    点击上方的sources查看源码,可以使用ctrl+p来搜索App.js,也可以直接在左侧搜索debuggerWorker.js,点开第一项就是App.js
    根据需要设置断点,注意,此时reload断点会失效,所以目前只能测试可以调用方法的,即只能在运行后,进行点击或者输入之类的才能debug,如果是第一次初始化界面的,全部直接跳过。
    右上方是正常的单步跳过、进入方法、跳出等调试常用方法。最右的圆形按钮,点击后可以设置pause on exception,出现异常就会自动断点,需要时可以打开。

    1. 初学者可能不知道怎么写方法,下面提供一个可以输入的界面,可以在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
      }
    });
    
    

    界面如下:

    ontextchange.jpg

    使用VSCode进行调试

    1. 先在插件商店下载React Native Tools

    2. 点击左边的虫子,点击上面下拉箭头(不是绿色剪头),添加配置,默认会创建lauch.json,搜索React debug android,然后直接按默认配置即可。

      vscodetoole.png
    3. 给App.js添加断点,在debug界面,点击绿色剪头(右边的名字就是在lauch.json中设置的名字),正常运行即可。

    4. 然而,如果你的插件版本是0.6.4,断点都不会成功,只会直接跳过 显示“未验证的断点,已设置断点但还未绑定”,目前这个问题已经被提交到vscode-react-native。应该是因为RN升级导致的不匹配,等待更新即可。

    其他调试方式

    1. 使用console.error() 显示红屏警告,使用console.warn()显示黄屏警告
    2. 参见RN中文网 调试部分

    建议:可以使用vscode编辑代码,使用chrome+RN Dev Tool断点调试,如果没有太大的问题,直接用console打印即可。
    遇到断点调试,断点不能hit,直接运行的情况,基本上都是插件不匹配,或者没有更新,如果更新RN dev tool还不能解决的话,基本上就是个待解决issue了。

    相关文章

      网友评论

        本文标题:01 ReactNative 初始文件分析、IDE和调试

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