react-native WebView與h5交互

公司一個(gè)項(xiàng)目使用react-native搭了app的架子,使用WebView加載h5實(shí)現(xiàn)UI界面,同時(shí)h5和app需要做很多交互,今天就來(lái)說(shuō)一下兩者的交互問(wèn)題。

一、react-native WebView和h5相互發(fā)送消息

(一)h5向react-native WebView發(fā)消息
  1. h5發(fā)送消息,只能傳遞string類型
data={
    "Name":"getUserId",
    "userId":"1234567890"
};
window.postMessage(JSON.stringify(data), '*');
  1. react-native中接收消息
    網(wǎng)頁(yè)端的 window.postMessage 只發(fā)送一個(gè)參數(shù) data,此參數(shù)封裝在 react-native端的 event 對(duì)象中,即 event.nativeEvent.data。data 只能是一個(gè)字符串。
_handlerMessage(evt) {
    let action = JSON.parse(evt.nativeEvent.data);
    switch (action.Name) {
        case "getUserId" : {
            console.log("獲取userId",evt.nativeEvent.data);
            break;
        }
    }
}
...
<WebView
    style={webViewStyle}
    source={{uri: this.state.url}}
    scalesPageToFit={Platform.OS === 'ios'}
    javaScriptEnabled={true}
    injectedJavaScript={onMessage}
    ref='webView'
    onMessage={(event) => this._handlerMessage(event)}
 />
...
(二)react-native WebView向h5發(fā)消息
  1. react-native發(fā)送消息
    首先WebView要綁定ref='webView',然后執(zhí)行this.refs['webView'].postMessage('發(fā)送消息');
let message = `{"Name":"selectPhoto","url":"${result.data}"}`;
console.log("選擇圖片",  message);
this.refs['webView'].postMessage(message);
  1. h5中接收消息
    h5在加載的時(shí)候注冊(cè)監(jiān)聽(tīng),監(jiān)聽(tīng)message

注意:這個(gè)監(jiān)聽(tīng)的名字只能叫message。

function selectPhoto(){
    window.document.addEventListener('message', function( message ){
        let action = JSON.parse(message.data);
        if(action.Name == "selectPhoto"){
            console.log("圖片地址",  action.url);
        }
    });
}

二、react-native WebView向h5注入js

react-native WebView的injectedJavaScript屬性可以設(shè)置 js 字符串,在網(wǎng)頁(yè)加載之前注入的一段 js 代碼。

  let message = `document.addEventListener('message', function( message ){
      let action = JSON.parse(message.data);
      if(action.Name == "goBackHome"){
        location.href = action.url;
      }
    })`
  ...
  <WebView
      style={webViewStyle}
      source={{uri: this.state.url}}
      scalesPageToFit={Platform.OS === 'ios'}
      javaScriptEnabled={true} // 控制是否啟用 JavaScript
      injectedJavaScript={message}
      ref='webView'
      onMessage={(event) => this._handlerMessage(event)}
   />
  ...
  reload(){
      let message = `{"Name":"goBackHome","url":"${this.state.url}"}`;
      console.log("返回首頁(yè)地址", typeof(message));
      this.refs['webView'].postMessage(message);
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容