前言&目录
前两篇文章主要介绍了react-native的集成方法,本篇文章主要记录react-native的使用,包括:
1.原生控制器添加react-native视图
2.js向原生系统传值或事件
3.原生系统向js传值或事件
一、原生控制器添加react-native视图
第一个使用例子很简单,说下要求:想要实现主控制器为原生控制器,点击后push到下一个控制器显示的是react-native视图。
新建一个集成react-native后的项目,并新建两个控制器。既然要在第二个控制器中放上react-native视图,那么前面的代码都以往的开发一样。
设置主视图
1 | // AppDelegate.m |
第一个控制器设置跳转
1 | // ViewController.m |
而在第二个控制器上放上加载js的代码。
1 | // NextViewController.m |
这样就实现了想在哪使用react-native就在哪使用。
效果:
二、js向原生系统传值或事件
数据传递
下面要实现的是,通过js向原生的程序传递数据。比如js里面的字符串要让程序打印出来。
下面开始实现:
新建一个继承NSObject且遵循RCTBridgeModule协议的类,这里命名为HelloWorld。
1 | // HelloWorld.h |
1 | // HelloWorld.m |
为了实现RCTBridgeModule
协议,需要包含RCT_EXPORT_MODULE()
宏。这个宏也可以添加一个参数用来指定在js中访问这个模块的名字。如果你不指定,默认就会使用这个类的名字。
通过RCT_EXPORT_METHOD()
宏来实现js调用的oc方法。也就是说,在宏中声明一个方法,js中能获取到这个方法,并且调用,从而向原生传值。
下面是js代码:
1 | // js |
可以拿出一个来看:
1 | // rn控件并添加响应 |
1 | // js响应方法 |
1 | // oc方法 |
通过代码可以看到通过点击rn的按钮执行StrOnPress()
方法,然后获取到HelloWorld
类的sendStr
方法,并调用,然后就会打印出来。
效果:
响应事件
如果当点击rn中的按钮时,想要再跳到下一个控制器,该怎么做。
我试过给当前这个HelloWorld添加了协议,让第二个控制器遵守协议,当点击按钮时控制器实现协议方法,在协议方法中跳转,但是失败了。
也试过给HelloWorld添加block,并在block中跳转,也失败了。
失败的原因在于,在控制器中初始化HelloWorld的实例和在
1 | RCT_EXPORT_METHOD(sendStr:(NSString *)str) |
方法中获得的self实例不是同一个。
目前能想到的方法是,直接在这个HelloWorld类中实现跳转。
1 | RCT_EXPORT_METHOD(sendStr:(NSString *)str) |
三、原生系统向js传值或事件
要实现的是js传递两个数给原生,原生判断大小并返回结果。
代码:
1 | RCT_REMAP_METHOD(compare, num1:(nonnull NSNumber *)num1 num2:(nonnull NSNumber *)num2 callback:(RCTResponseSenderBlock)callback) |
1 | compareOnPress() |
效果:
这里是通过RCTResponseSenderBlock
来实现回调的。
再放一个例子:
1 | RCT_REMAP_METHOD(printDate, date1:(nonnull NSNumber *)d1 date2:(nonnull NSNumber *)d2 event:(RCTResponseSenderBlock)callback) |
1 | import React, { Component } from 'react'; |
效果:
v1.5.2