React Native 调用 Native 模块

  1. 声明一个类,必须实现<RCTBridgeModule> 协议

  2. .m文件中实现宏定义RCT_EXPORT_MODULE(),当它加载的时候,会自动注册

// js_name 就是react native 获取类时所对应的名称,
// 即 NativeModules.js_name
// 传空的话,名称就是类名字
// #define RCT_EXPORT_MODULE(js_name)
 // .m 文件
 RCT_EXPORT_MODULE(Test);
 
 // js 文件
 import {NativeModules} from 'react-native';
 var Test = NativeModules.Test;
复制代码
  1. 调用方法,js调用OC的方法
  • 需要另外一个宏RCT_EXPORT_METHOD(method),js 中 使用.来调用
  • 方法返回值类型必须为void
  • 传参类型
    • string: NSString
    • number: 基本类型
    • boolean
    • array
    • object: NSDictionary, key为string,value是列表中的类型
    • function: RCTResponseSenderBlock
// .m 文件
RCT_EXPORT_METHOD(print:(NSString *)text)
{
    NSLog(@"---------%@", text);
}

// js文件
Test.print('Hello World!'); 
复制代码
  1. 回调函数,js中的参数经过OC方法的处理,结果再返回给js
  • RCTResponseSenderBlock 唯一参数,数组
  • 第一个元素一般为错误对象,第二个元素才是返回结果
// .m
RCT_EXPORT_METHOD(add:(NSInteger)numA andNumB:(NSInteger)numB result:(RCTResponseSenderBlock)callback) {
     callback(@[[NSNull null], @(numA + numB)]);
}

// js
Test.add(1, 2, (error, result)=>{
     alert('1 + 2 =' + result);
});
复制代码
  1. 设定原生模块所处线程
  • 实现- (dispatch_queue_t) methodQueue,即原生模块中的所有方法都会在methodQueue中执行
  • 也可以RCT_EXPORT_METHOD()方法内部开辟分线程,让一些费时的操作在分线程中执行
RCT_EXPORT_METHOD(doSomethingExpensive:(NSString *)parma callback:(RCTResponseSenderBlock)callback) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       
          // 执行长时间的操作
          
          // callback视情况 1, 2 位置都可以
          // 1. callback(@[]);
       });
     
       // 2. callback(@[]);
}
复制代码
  1. 导出常量
  • 原生模块导出一些常量,让js可以随时访问,并且运行期间不会改变
  • 方法名必须是- (NSDictionary *)constantsToExport
// .m
- (NSDictionary *)constantsToExport
{
    return @{
             @"firstDayOfWeek": @"Monday"
             };
}

// js
alert(Test.firstDayOfWeek);
复制代码
  1. 发送事件

  2. 类需要继承RCTEventEmitter

    #import "RCTEventEmitter.h"
    #import "RCTBridgeModule.h"
     
    @interface MyModule : RCTEventEmitter  <RCTBridgeModule>
    
    复制代码
  3. 实现supportedEvents方法,设置发送事件的名称

    ```
    // 注册该类,对外名称为RN,
    RCT_EXPORT_MODULE(RN);
    // 设置可以发送的事件名称数组
    - (NSArray<NSString *> *)supportedEvents
    {
        return @[@"textChange"];
    }
    
    - (void)changeText:(NSString *)text
    {
    
        self.text = text;
        // 发送事件
        [self sendEventWithName:@"textChange" body:@{
                                                    @"text": self.text
                                                    }];        
    
    }
    ```
    复制代码

3.  js文件中

	```
	import { NativeModules, NativeEventEmitter } from 'react-native'
	// 获取组件RN
	var RN = NativeModules.RN;

	const RNEvent = new NativeEventEmitter(RN);

	var subscription = RNEvent.addListener(
	    'textChange',
	    (result) => alert(result.text)
	);

	```
复制代码

参考链接: 官网 中文官网 发送事件

React Native提供了一个名为`WebView`的组件,可以用来加载并运行HTML页面,并且可以与HTML页面中的JavaScript代码进行交互。使用WebView可以实现在React Native调用JavaScript方法的功能,具体步骤如下: 1. 安装WebView组件:在React Native项目中执行`npm install react-native-webview`命令安装WebView组件。 2. 导入WebView组件:在需要使用WebView组件的文件中,使用`import { WebView } from 'react-native-webview';`语句导入WebView组件。 3. 在render()方法中使用WebView组件:使用`<WebView />`标签创建一个WebView组件,并设置`source`属性为HTML页面的URL或者本地文件路径。 4. 在JavaScript中定义需要调用的方法:在HTML页面中定义需要调用的JavaScript方法,并使用`window.ReactNativeWebView.postMessage()`方法向React Native发送消息。 5. 在React Native调用JavaScript方法:使用WebView组件的`injectJavaScript()`方法向WebView中注入JavaScript代码,调用在HTML页面中定义的方法。 示例代码如下: ``` import React, { Component } from 'react'; import { WebView } from 'react-native-webview'; class MyWebView extends Component { onMessage = (event) => { const { data } = event.nativeEvent; // 收到HTML页面发送的消息 console.log(data); } render() { return ( <WebView source={{uri: 'https://example.com'}} onMessage={this.onMessage} /> ); } } export default MyWebView; ``` HTML页面代码: ``` <button onclick="sendMessage()">发送消息</button> <script> function sendMessage() { window.ReactNativeWebView.postMessage('Hello from HTML!'); } </script> ``` 在React Native调用HTML页面中的`sendMessage()`方法: ``` webViewRef = React.createRef(); // 在componentDidMount()方法中获取WebView组件的引用 componentDidMount() { this.webViewRef.current.injectJavaScript(` sendMessage(); `); } ``` 上述代码通过在HTML页面中定义了一个`sendMessage()`方法,并使用`window.ReactNativeWebView.postMessage()`方法发送消息到React Native中。在React Native中使用`injectJavaScript()`方法向WebView中注入JavaScript代码,调用HTML页面中的`sendMessage()`方法,从而实现了React Native调用JavaScript方法的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值