在實際開發中,咱們一般會嵌入一些html頁面,官方爲咱們提供了一個很是好用的網頁組件WebView,經過這個組件咱們能夠經過傳入一個url或者是傳入一段htmlhtml
render() { return ( <View style={styles.container}> <WebView ref={webView => this.webView = webView} startInLoadingState={true} onNavigationStateChange={e => this.onNavigationStateChange(e)} source={{ uri: 'https://github.com/xxxxxxx'}} /> </View> ); }
render() { return ( <View style={styles.container}> <WebView ref={webView => this.webView = webView} startInLoadingState={true} onNavigationStateChange={e => this.onNavigationStateChange(e)} source={{ html: '<h1'>Demo</h1>'}} /> </View> ); }
思路: 經過jnjectedJavaScript的方式注入JS,在H5頁面加載以後當即執行。(能夠理解爲是在WebView中去主動觸發H5的方法,從而實現通訊)html5
須要注意的是,injectedJavaScript注入的必須是JS,注入的內容能夠是方法的實現也能夠是方法名。其實注入函數名的時候,實際上注入的仍然是函數的實現。當注入js方法名須要傳遞參數的時候,能夠提早將函數名做爲字符串,函數參數做爲變量,經過生成一個字符串而後再講字符串注入。java
render() { let text = 'back'; let call = `call('${text}')`; return ( <View style={{flex: 1, backgroundColor: 'white', marginBottom: SAFE_AREA_BOTTOM_HEIGHT}}> <WebView style={{flex: 1}} ref='webView' injectedJavaScript={`${text1}`} source={{ html: '<body>\n' + '<button onClick="call()" style="margin-top: 100px;" id="call">call</button>\n' + '<script>\n' + ' function call(text) {\n' + ' var btn= document.getElementById(\'call\')\n' + ' btn.innerHTML="text";\n' + ' }\n' + '\n' + '</script>\n' + '</body>' > </WebView> </View> ); }
上述代碼當經過WebView向RN頁面注入一個html代碼的時候,經過injectedJavaScript向H5通訊,而後更改button的名字。git
該方式能夠雙向發送消息github
WebView綁定ref,經過html5新增的postMessage發送消息web
onLoadEnd={() => { this.refs.webView.postMessage('RN向H5發送的消息'); }}
在H5中註冊監聽dom
window.onload = function() { document.addEventListener('message', function(msg) { console.log(msg) message = msg.data; }); }
在RN端經過onMessage接收消息函數
onMessage={(event) => {console.log(event.nativeEvent.data);}}
網頁端的 window.postMessage 只發送一個參數 data,此參數封裝在 RN 端的 event 對象中,即 event.nativeEvent.data。data 只能是一個字符串。post
H5發送消息,此時只能傳遞string類型flex
window.postMessage('網頁向rn發送的消息');