React Native WebView 进阶:实现带回调函数的通讯

实现带回调的通讯

Web 端实现

在网页中,我们使用 window.callbacks 对象来注册回调函数,并将 callbackId 传递给 App:

html 复制代码
<script>
  window.callbacks = {
    callbacks: {},
    register: function(successCallback, errorCallback) {
      const callbackId = Date.now().toString();
      this.callbacks[callbackId] = {
        success: successCallback,
        error: errorCallback,
      };
      return callbackId;
    },
    execute: function(callbackId, type, data) {
      const callback = this.callbacks[callbackId];
      if (callback) {
        if (type === 'success') {
          callback.success && callback.success(data);
        } else {
          callback.error && callback.error(data);
        }
        delete this.callbacks[callbackId]; // 执行后删除回调
      }
    },
  };

  function sendMessageToApp(message) {
    const callbackId = window.callbacks.register(
      (data) => console.log('Success:', data),
      (error) => console.log('Error:', error)
    );

    window.ReactNativeWebView.postMessage(JSON.stringify({ callbackId, message }));
  }
</script>
App 端实现

在 React Native 中,我们接收 Web 发送的消息,并根据 callbackId 返回结果:

javascript 复制代码
import React, { useRef } from 'react';
import { WebView } from 'react-native-webview';
import { Button } from 'react-native';

const MyWebView = () => {
  const webViewRef = useRef(null);

  const onMessage = (event) => {
    const { callbackId, message } = JSON.parse(event.nativeEvent.data);

    // 模拟处理操作并返回结果
    const result = `Processed: ${message}`;

    const script = `
      window.callbacks.execute('${callbackId}', 'success', ${JSON.stringify(result)});
    `;
    webViewRef.current.injectJavaScript(script);
  };

  return (
    <WebView
      ref={webViewRef}
      source={{ uri: 'https://example.com' }}
      onMessage={onMessage}
      style={{ flex: 1 }}
    />
  );
};

export default MyWebView;
解释
  1. Web 端 :使用 register 方法注册成功和失败回调,并将 callbackId 通过 postMessage 传递给 App。

  2. App 端 :在接收到消息后,根据 callbackId 处理数据,然后通过 injectJavaScript 调用 Web 端的 execute 方法来执行相应的回调。

相关推荐
幸运小圣27 分钟前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
志尊宝2 小时前
Vue3 零基础每日笔记(038):亲手封装 useDebounceFn 与 useThrottleFn——高频事件的流量阀
前端·javascript·vue·html·vue3
默_笙4 小时前
🚅 地铁的"回头路、存档点与人工闸机"(下):LangGraph 的循环、持久化与中断
前端·javascript
flash俊杰4 小时前
Zod Schema 驱动的 IPC 契约:从入参校验到状态机一致性的三层防御
javascript·typescript
一条溺水的鱼6 小时前
一次讲透 JS 原型链 —— prototype、__proto__ 和 constructor 到底啥关系
javascript
三乐2286 小时前
一文搞懂 JS 事件流:捕获、冒泡、事件委托
javascript·html
愛芳芳9 小时前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue
阿虎儿9 小时前
论 JavaScript 的怪异之处
javascript
gnip10 小时前
uts 插件示例:获取设备电量信息
前端·javascript
gnip11 小时前
uni-app 原生插件
前端·javascript·uni-app