react native 原生模块桥接的简单说明小结
Android
创建原生模块包
- 通过继承ReactPackage为你的原生模块包创建Java类,可以这么写:
- 覆盖createNativeModules和createViewManagers方法
publicclassMyNativePackageimplementsReactPackage{ @Override publicListcreateNativeModules(ReactApplicationContextreactContext){ } @Override publicList createViewManagers(ReactApplicationContextreactContext){ } }
在createNativeModules方法中添加原生模块
publicListcreateNativeModules(ReactApplicationContextreactContext){ List modules=newArrayList<>(); modules.add(newMyNativeModule(reactContext)); returnmodules; }
在createViewManagers方法中添加原生UI组件
publicListcreateViewManagers(ReactApplicationContextreactContext){ List components=newArrayList<>(); components.add(newRNNativeComponent()); returncomponents; }
创建原生模块
先通过继承ReactContextBaseJavaModule创建MyNativeModule类。
publicclassMyNativeModuleextendsReactContextBaseJavaModule{ publicMyNativeModule(ReactApplicationContextreactContext){ super(reactContext); } }
为了让ReactNative在NativeModules中找到我们的模块,我们还需要覆盖getName方法。
@Override publicStringgetName(){ return"MyNativeModule"; }
现在我们已经拥有一个可以导入到JavaScript代码的原生模块,现在可以向其中加入功能。
暴露模块方法:定义一个接受设置参数、成功回调和失败回调的Show方法。
publicclassMyNativeModuleextendsReactContextBaseJavaModule{ @ReactMethod publicvoidShow(ReadableMapconfig,CallbacksuccessCallback,CallbackcancelCallback){ ActivitycurrentActivity=getCurrentActivity(); if(currentActivity==null){ cancelCallback.invoke("Activitydoesn'texist"); return; } } }
在JavaScript中调用模块方法
import{NativeModules}from'react-native' const{MyNativeModule}=NativeModules MyNativeModule.Show( {},//ConfigParameters ()=>{},//SuccessCallback ()=>{}//CancelCallback )
注意:
模块方法只提供静态引用,不包含于react树中。
创建原生UI组件
如果你需要在react树中渲染一个原声UI组件
创建一个继承ReactNativeViewGroupManager的Java类
publicclassRNNativeComponentextendsViewGroupManager{ publicstaticfinalStringREACT_CLASS="RNNativeComponent"; }
覆盖getName方法:
@Override publicStringgetName(){ returnREACT_CLASS; }
覆盖createViewInstance方法,返回你的自定义原生组件
@Override protectedFrameLayoutcreateViewInstance(finalThemedReactContextreactContext){ return//用FrameLayout包裹的自定义原生组件 }
创建原生prop方法
@ReactProp(name="prop_name") publicvoidsetPropName(NativeComponentnativeComponent,propDataTypeprop){ }
JavaScript中使用
import{requireNativeComponent}from"react-native" constMyNativeComponent=requireNativeComponent("RNNativeComponent",RNNativeComponent,{ nativeOnly:{} })
iOS
Macro
- RCTBridgeModule:RCTBridgeModule是一个protocol,它为注册bridge模块RCTBridgeModule@protocolRCTBridgeModule提供了一个接口
- RCT_EXPORT_MODULE(js_name):在classimplementation时使用bridge注册你的模块。参数js_name是可选的,用作JS模块的名称,若不定义,将会默认使用Objective-C的class名
- RCT_EXPORT_METHOD(method)RCT_REMAP_METHOD(,method):bridge模块亦可定义方法,这些方法可以作为NativeModules.ModuleName.methodName输出到JavaScript。
RCT_EXPORT_METHOD(funcName:(NSString*)onlyString secondName:(NSInteger)argInteger) {...}
上面的例子暴露到JavaScript是NativeModules.ModuleName.funcName
创建原生模块包
我们需要在项目中添加两个文件:头文件和源文件。
-MyNativePackage.h #import"RCTBridgeModule.h" @interfaceMyNativePackage:NSObject@end -MyNativePackage.m #import"MyNativePackage.h" @implementationMyNativePackage RCT_EXPORT_MODULE(); @end
创建模块方法
RCT_EXPORT_METHOD(Show:(RCTResponseSenderBlock)callback){ }
JavaScript中引入模块方法
import{NativeModules}from'react-native' constMyNativeModule=NativeModules.MyNativeModule MyNativeModule.Show(()=>{})
创建原生View组件
创建view方法,返回你的原声组件
-(UIView*)view{ //Initialize&returnyournativecomponentview }
创建原生prop方法
RCT_CUSTOM_VIEW_PROPERTY(prop,DATA_TYPE_OF_PROP,YOUR_NATIVE_COMPONENT_CLASS){ }
在JavaScript中使用
import{requireNativeComponent}from"react-native" constMyNativeComponent=requireNativeComponent("RNNativeComponent",RNNativeComponent,{ nativeOnly:{} })
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。