React Native学习笔记

1. props和state比较

1.1 props是在父组件中指定的,一经指定,那么在被指定的组件的生命周期中是不再改变的,一般是组件在创建的时候,使用props去做定制。

1.2 对于需要改变的数据,可以使用state,ES6中在constructor中初始化state(早期ES5的例子中会使用getInitialState做初始化),然后在修改的地方调用setState即可。

2.ReactNative component生命周期:
component生命周期

3. ReactNative 使用flex做实现弹性宽高

在组件样式中使用flex可以使其在可利用的空间中动态地扩张或收缩。一般而言我们会使用flex:1来指定某个组件扩张以撑满所有剩余的空间。如果有多个并列的子组件使用了flex:1,则这些子组件会平分父容器中剩余的空间。如果这些并列的子组件的flex值不一样,则谁的值更大,谁占据剩余空间的比例就更大(即占据剩余空间的比等于并列组件间flex值的比)。

注意:组件能够撑满剩余空间的前提是其父容器的尺寸不为零。如果父容器既没有固定的widthheight,也没有设定flex,则父容器的尺寸为零。其子组件如果使用了flex,也是无法显示的。

4.ReactNative 使用flexBox指定组件的布局

4.1一般来说使用flexDriection(定义布局排列方向,默认为纵向排列column)、justifyContent(定义主轴的排列方式:flex-start、center、flex-end、space-around以及space-between)和alignItem(定义与主轴垂直的次轴排列方式:flex-start、center、flex-end以及stretch)即可完成基本布局,更多布局字段见布局样式属性

5.ReactNative中使用到的列表控件

5.1常用的列表控件FlatListFlatList组件必须的两个属性是datarenderItemdata是列表的数据源,而renderItem则从数据源中逐个解析数据,然后返回一个设定好格式的组件来渲染。FlatList相对于ListView的优点就是会优先渲染屏幕上可见的元素,而不是一次性渲染全部元素。

5.2对于需要做分组的列表控件,可以使用SectionList,那么相对于FlatListSectionListdata就会更加复杂了,同时还多了一个属性renderSection用于渲染区的头部试图。

6.Native项目中集成RN页面(使用cocoapods集成)

6.1新建一个native+reactnative的文件夹(以Native+ReactNativeDemoRoot为例),在该文件夹中建子文件夹/ios,再把native工程拷贝到ios文件夹中。

6.2Native+ReactNativeDemoRoot中创建package.json文件(也可以使用npm init创建,但是内容需要一步一步输入,而且key值可能会忘记,有模板的话直接创建最方便了,package.json中的key值可以使用npm help json去查询),注意package.json中的react-native的版本号,这个会影响native工程中podfile需要引入的文件。

"dependencies": {
    "react": "16.0.0-alpha.6",
    "react-native": "0.44.3"
  }

6.3在根目录(即包含有package.json文件的目录)中执行命令npm install来安装React和React Native模块,这些模块会被安装到根目录下的node_modules/目录中(所有通过npm install命令安装的模块都会放在这个目录中。这个目录我们原则上不复制、不移动、不修改、不上传,随用随装)。

6.4进入到native工程中,执行命令pod init初始化Podfile文件,可以拷贝ReactNative中文网/集成到现有原生应用中的Podfile模板,Podfile文件完成后使用命令pod install安装React Native的pod包。

# target的名字一般与你的项目名字相同
target 'NumberTileGame' do

  # 'node_modules'目录一般位于根目录中
  # 但是如果你的结构不同,那你就要根据实际路径修改下面的`:path`
  pod 'React', :path => '../node_modules/react-native', :subspecs => [
    'Core',
    'CxxBridge', # 如果RN版本 >= 0.45则加入此行
    'DevSupport', # 如果RN版本 >= 0.43,则需要加入此行才能开启开发者菜单
    'RCTText',
    'RCTNetwork',
    'RCTWebSocket', # 这个模块是用于调试功能的
    # 在这里继续添加你所需要的RN模块
  ]
  # 如果你的RN版本 >= 0.42.0,则加入下面这行
  pod "yoga", :path => "../node_modules/react-native/ReactCommon/yoga"

   # 如果RN版本 >= 0.45则加入下面三个第三方编译依赖
  pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
  pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
  pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'

end

注意:
1.需要根据项目路径修改path
2.需要根据package.json中的react-native版本对引入的文件做修改

6.5接下来就开始写JS的代码了,在根目录中创建index.js文件(注意在0.49版本之前是index.ios.js文件),在文件中添加ReactNative的代码,ReactNative中使用到的模块都需要在Native的Podfile中对相应的引入哦!

index.js是React Native应用在iOS上的入口文件。而且它是不可或缺的!它可以是个很简单的文件,简单到可以只包含一行require/import导入语句。本教程中为了简单示范,把全部的代码都写到了index.js里(当然实际开发中我们并不推荐这样做)。注意index.js中函数registerComponent注册的模块,在Native工程中会用到

6.6在Native项目中添加一个事件处理,跳转到ReactNative页面,这里会使用到一个类RCTRootView,debug时使用下面的代码加载ReactNative的界面,release时URL需要改变,具体后续补充。。。

    NSURL *reactNativeLocation = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios"];

    //moduleName就是在index.js中使用registerComponent注册的模块
    //initialProperties用于把native界面的数据传输给ReactNative界面,ReactNative界面使用this.props即可获取
    //launchOptions有待补充
    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:reactNativeLocation
                                                        moduleName:@"ReactNativePage"
                                                 initialProperties:nil
                                                     launchOptions:nil];
    UIViewController *rootViewController = [[UIViewController alloc] init];
    rootViewController.view = rootView;
    [self.navigationController pushViewController:rootViewController animated:YES];

6.7在根目录中执行命令npm start启动开发服务器(即Packager,它负责实时监测js文件的变动并实时打包,输出给客户端运行),最后编译运行Native项目即可。

Packager只是在开发时需要,便于你快速开发迭代。在正式发布应用时,所有的js文件都会被打包为一整个jsbundle文件离线运行,此时客户端不再需要Packager服务。

7.动画-Animate

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

推荐阅读更多精彩内容