React Native 入门笔记

接触React Native有一段时间了,鉴于国内资料的缺乏,入门的时候相当痛苦,踩了不少坑,以下的笔记希望可以帮助和我一样有投入RN热情的同伴少走一些弯路,如有纰漏,欢迎大家交流指正

(除了百度、Google这两位无名老师之外,感谢RN中文网东方耀老师的视频


当前的编程环境:MacOS 10.11.4,Xcode 7.3.1,Android Studio 2.0,Sublime Text 2(插件配置以下有),RN的版本 0.26

个人推荐用Mac环境,环境配置简单(具体请看RN中文网的配置,有些命令可能会出现权限问题,在命令前面加上sudo),可以做android和ios开发(需要提前安装Xcode)

学习路线(配置完环境):html、css、js入门知识  ---> React JS的入门及生命周期学习(掌握JSX语法) ---> RN组件学习(从View开始) ---> RN的弹性盒布局和API方法学习


环境部分

1.sublime安装插件

(1)使用View > Show Console的方式打开命令行,然后用网络找到的代码安装Package Control(具体方法百度),安装之后重启生效

(2)使用Sublime Text 2 > Preference > Package Control,选择install Package,安装以下插件:

Emmet(有自己的语法,快速写CSS和HTML,文件名要html和css才可以生效)

HTML-CSS-JS Prettify    格式化代码

Spacegray    主题,使整体更好看https://github.com/kkga/spacegray,安装之后Sublime Text 2 > Preference > Settings-User,在里面引用相关的主题(可能要在之前的代码后面加逗号),引用之后立刻生效,具体git上也有详细说明


2.真机调试

相同的部分:USB连接手机,使电脑和手机在同个局域网(连同个wifi或者开电脑热点)

ios:

(1)在命令行中找到项目文件夹,即ls命令可以看到index.ios.js的目录,输入react-native run-ios,启动js服务器,看到 React packager ready. 并且没有报错实施下一步

(2)在项目文件夹中打开 ios -> [项目名称].xcodeproj,找到AppDelegate.m中的jsCodeLocation变量,将里面localhost改为相对应的电脑 ip,然后运行真机,摇晃一下点击Reload JS

android:

(1)配置好ANDROID_HOME环境(具体请百度),输入adb devices可以看到连接的设备

(2)在命令行中找到项目文件夹,即ls命令可以看到index.android.js的目录,输入react-native run-android,启动js服务器,看到 React packager ready. 并且没有服务器启动报错实施下一步

(3)这时如果命令行有** BUILD FAILED **,看这一行上面的报错,有可能是相对应的SDK版本或者ADT的版本不存在(比如默认的ADT 23.0.1版本没下载到电脑),可以打开Android的SDK Manager安装缺失的东西,然后再按照上一个步骤(若没生效,可以重启命令行试试)

(4)这时如果命令行有** BUILD SUCCEEDED **,摇晃手机或者点menu键可以出现一个菜单,点击Dev Settings -> Debug server host & port for device,输入电脑ip,确定,然后后退到主界面,摇晃手机或者点menu键,选择Reload JS

注:可以在手机的浏览器中输入  http://[电脑ip]:8081/index.ios.bundle?platform=ios&dev=true,观察服务器的命令行是否有请求消息输出,来判断手机是否可以访问到电脑的服务器


3.验证JS服务器是否成功开启

在命令行react-native run-ios(或者run-android)之后,有服务器的命令行弹出,这时在电脑浏览器中运行http://[电脑ip]:8081/index.ios.bundle?platform=ios&dev=true,命令行会有请求数据输出,如  [14:16:46] request:/index.ios.bundle?plarform=ios&dev=true        [14:16:46] request:/index.ios.bundle?plarform=ios&dev=true (19ms)


编程部分

1.React 生命周期

(1)初始化可以调用的函数:(组件还未渲染)

getDefaultProps    获取实例的默认属性,只调用一次,实例之间共享引用

getInitialState(在RN中constructor(props) 取代)初始化状态,初始化各个实例特有的状态

componentWillMount  组件即将被装载,render之前最后一次修改状态的机会

render  渲染虚拟的DOM节点,只能访问 this.props 和 this.state ,只有一个顶层组件,不允许修改状态和DOM输出

componentDidMount  组件真正被装载,成功render并渲染完成真实DOM之后触发,可以修改DOM

(2)运行中可以调用的函数:

componentWillReceiveProps 组件在接收到属性前触发,父组件修改属性触发,可以修改新属性、修改状态

shouldComponentUpdate  当组件接收到新属性和状态的时候触发,返回false会阻止render调用(小心使用)

componentWillUpdate  将要更新,不能修改属性和状态

render  同上

componentDidUpdate  会在组件更新完调用,可以修改DOM

(3)销毁阶段可以调用的函数:

componentWillUnmount  在组件真正销毁之前调用


2.自定义组件要大写

如var HelloWorld = Recct.createClass();

class Summary extends Component{}


3.RN所支持的最低iOS和Android版本

Android >= 4.1 (API 16)

iOS >= 7.0


4.style优先级

<View style={[styles.base,  styles.background]}>.............. </View>

一个View可以接受多个style,如果有多个值,要用中括号 [] 括起来,最右边的元素优先级最高,最右边的style会覆盖之前相同属性的属性值


5.屏幕宽高

(1)设置高度或宽度时不用带单位,默认使用pt

(2)不能用百分比设置宽度高度

(3)可通过Dimensions模块来获取窗口宽高(可通过手动计算获取宽高)

var Dimensions = require(‘Dimensions’);(ES6写法改成import Dimensions from 'Dimensions';)

var {

width,

height

} = Dimensions.get(‘window’)


6.可通过PixelRatio模块来获取像素密度

var pixelRation = PixelRatio.get();

屏幕可以显示的最小像素:1/pixelRation,可以用来设置border的宽度


7.render方法的注意点

(1)render() {return ();}   return的最外层有且只有一个View,否则会报错

(2)第一次初始化之后调用。界面呈现后,每次调用this.setState({[属性]:[属性值]})方法,系统都会重新调用render方法渲染视图


8.文本换行: {'\n'}

如<Text>Hello {'\n'} World</Text>,中间会换行


9.外部文件引入写法

ES5写法:

(1)被引用的组件:要在文件底部有module.exports = [组件名称];(删掉入口函数

AppRegistry.registerComponent)。如module.exports = Header;

(2)引用的文件:const [组件名称] = require('./[文件名称不带后缀]’);,如const Header = require('./header');

ES6写法(最新):

(1)被引用的组件:在组件前面加上export default(删掉入口函数AppRegistry.registerComponent)。如export default class LoginUI extends Component

(2)引用的文件:import [组件] from ‘组件的路径’;  。如import LoginUI from './LoginUI.js';


10.引用第三方模块相关命令:(在项目根目录,即package.json文件所在的目录)

npm的命令:

安装模块:npm i [模块名称] —save,如    npm i react-native-swiper —save

查看模块:npm view [模块名称],如    npm view react-native-swiper

删除模块:npm rm [模块名称] —save,如    npm rm react-native-swiper —save

查看帮助命令:nam help [命令],如    nam help i


11.TouchableHighlight、TouchableNativeFeedback、TouchableWithoutFeedback注意点

(1)均可通过onPress方法响应触碰事件,如果还没学会使用箭头函数,就要加上相关函数后面bind(this),否则this.setState会出现找不到对象的情况。                                                 如 onPress={this.clickTarget.bind(this)}

(2)包裹内容的最外层有且只有1个对象,如果里面有多个对象,最外层用一个VIew包裹起来

(3)Text自带onPress方法,如果不需要交互效果,如按钮的点击变色,可以直接用Text实现点击事件,如

<Text onPress={this.clickTarget.bind(this)}>click me</Text>



暂时先到这里,如有纰漏,欢迎大家交流指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容