React Native 与H5 通讯

51 阅读1分钟

1.h5向rn通讯

通过window.ReactNativeWebView?.postMessage() 向RN发送消息

export function sendData(msg, info) {
  if (window.ReactNativeWebView) {
    window.ReactNativeWebView?.postMessage(JSON.stringify({ msg, info }));
  } else {
    throw Error('postMessage接口还未注入');
  }
}

2.RN中接收信息

RN中使用WebView的onMessage接收消息

const onMessage = (e: any) => {
    if (e?.nativeEvent?.data) {
      const { msg, info } = JSON.parse(e?.nativeEvent?.data);
      switch (msg) {
        case "takePhoto": {
          takePhoto();
          break;
        }
        case "chooseImage": {
          handleChooseImage();
          break;
        }
        case "video": {
          onStartRecord();
          break;
        }
        default:
          break;
      }
    }
  };
  <WebView
    ...
    onMessage={onMessage}

  />

3.rn中直接修改展示的h5页面

通过传递injectedJavaScript对js进行修改

const injectedJS = `
var backButton = document.createElement("button");
backButton.onclick = function () {
    window.history.back();
};

var svgIcon = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svgIcon.setAttribute("width", "22px");
svgIcon.setAttribute("height", "22px");
var path = document.createElementNS("http://www.w3.org/2000/svg", "path");
path.setAttribute("d", "M12.354 4.86719L13.618 6.13114L8.74995 10.9992L13.618 15.8672L12.354 17.1311L6.22205 10.9992L12.354 4.86719Z"); // 这里填入你的 SVG 图像路径
path.setAttribute("fill", "#18191A");
svgIcon.appendChild(path);
backButton.appendChild(svgIcon);
`
 <WebView
    ...
    injectedJavaScript={injectedJS}
  />