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 方法来执行相应的回调。

相关推荐
我有一棵树4 小时前
避免 JS 报错阻塞 Vue 组件渲染:以 window.jsbridge 和 el-tooltip 为例
前端·javascript·vue.js
没有鸡汤吃不下饭5 小时前
解决前端项目中大数据复杂列表场景的完美方案
前端·javascript·vue.js
旧雨散尘5 小时前
【react】react初学6-第一个react应用-待办事项
前端·react.js·前端框架
Tzarevich5 小时前
现代JavaScript字符串处理:从基础语法到模板字符串的深度演进与技术实践
javascript
低保和光头哪个先来6 小时前
如何实现弹窗的 双击关闭 & 拖动 & 图层优先级
前端·javascript·css·vue.js
阿豪啊7 小时前
Prisma ORM 入门指南:从零开始的全栈技能学习之旅
javascript·后端·node.js
Eiceblue7 小时前
React 前端实现 Word(Doc/Docx)转 HTML
前端·react.js·word
FogLetter7 小时前
大文件上传?我用分片上传+断点续传彻底解决了!
前端·javascript
Qinana8 小时前
🌟ES6 字符串模板与数组 map 的优雅实践
前端·javascript·程序员
残冬醉离殇8 小时前
深入理解浏览器事件系统:从用户点击到事件对象的完整旅程
前端·javascript