react navite 简单原生方法双向调用示例

如果你说的是 React Native 原生模块(Native Modules)双向调用,面试里最简单、最容易讲清楚的就是:

JS → Native:调用原生方法

Native → JS:通过 EventEmitter 主动通知 JS

下面给你一个最小示例。

1. JS 调用 Native

假设 Android 原生提供:

复制代码
public class MyModule extends ReactContextBaseJavaModule {

    public MyModule(ReactApplicationContext context) {
        super(context);
    }

    @Override
    public String getName() {
        return "MyModule";
    }

    @ReactMethod
    public void hello(String name, Promise promise) {
        promise.resolve("Hello " + name);
    }
}

JS 侧:

复制代码
import {NativeModules} from 'react-native';

const {MyModule} = NativeModules;

async function test() {
  const result = await MyModule.hello('张三');

  console.log(result);
}

调用关系:

复制代码
React Native JS
     │
     │ MyModule.hello()
     ↓
Android Native
     │
     │ promise.resolve()
     ↓
React Native JS

2. Native 主动调用 JS

Native 不能像普通函数一样直接调用 JS,一般使用 DeviceEventEmitter / NativeEventEmitter。

Android:

复制代码
private void sendMessage() {
    getReactApplicationContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit("MyEvent", "Hello from Native");
}

JS:

复制代码
import {DeviceEventEmitter} from 'react-native';

useEffect(() => {
  const subscription = DeviceEventEmitter.addListener(
    'MyEvent',
    data => {
      console.log('收到 Native 消息:', data);
    }
  );

  return () => {
    subscription.remove();
  };
}, []);

调用关系:

复制代码
Android Native
     │
     │ emit("MyEvent")
     ↓
React Native JS
     │
     │ addListener()
     ↓
收到消息

3. 面试直接背这个"双向调用"

复制代码
              React Native JS
             ↗             ↘
      JS 调 Native       Native 通知 JS
          │                   │
          ↓                   ↓
    Native Module        EventEmitter
          │                   │
          ↓                   ↓
       原生方法            JS Listener

一句话回答面试官:

React Native 中 JS 调 Native,通常通过 NativeModules 暴露原生方法;Native 调 JS,通常通过事件机制,比如 DeviceEventEmitter 或 NativeEventEmitter,把消息主动派发给 JS。

如果你要准备 React Native 面试手写题,我也可以继续给你整理一套「JS ↔ Native、Bridge、TurboModule、Fabric」高频题。

相关推荐
福兮说8 小时前
浏览器里把 iPhone 的 HEIC 转成 JPG:Chrome 解不开、转完大了七成、拍摄时间全丢,六个坑实测
前端·javascript·图像处理·chrome·ios·iphone·heic
可乐鸡翅yeah_9 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
用户1179536547810 小时前
TRAE vs Claude Code 性能对比:从代码生成、多文件重构到底层吞吐,谁更适合你的日常开发?
javascript
kill52211 小时前
useRef
前端·javascript·react.js
米多科技12 小时前
我做了一个 3D 虚拟世界基底,在上面再搭 3D 世界或元宇宙,事半功倍
javascript·人工智能·github
霍营_托尼12 小时前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
西柚小萌新13 小时前
【LLM&&AI应用开发 八股文】--4.2.Agent智能体(中)
前端·javascript·react.js
Java后端的Ai之路13 小时前
03_React_JSX
前端·react.js·前端框架
百度一下吧13 小时前
断网后 WebView 加载单页面应用:页面跳转 JS 加载失败的处理方案
开发语言·javascript·ecmascript
程序员Sunday14 小时前
Promise.all、allSettled、race、any 怎么选,失败后其他请求会怎样
开发语言·前端·javascript