WebView是ReactNative中的元件, 它可以創建一個原生的WebView,可以用於訪問一個網頁.本文主要和大家介紹react native與webview通信的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。
有時候我們需要在RN與WebView之間進行溝通,或者進行資料傳遞,或者發送訊息通知.這時候就要用以下知識了.
#一:WebView向RN端發送資料:
首先,我們建立一個webview:
<WebView ref={'webview'} source={require('./index.html')} style={{width: 375, height: 220}} onMessage={(e) => { this.handleMessage(e) }} />
可以看到其中有一個onMessage方法,
onMessage function
在webview內部的網頁中呼叫window.postMessage方法時可以觸發此屬性對應的函數,從而實現網頁和RN之間的資料交換。 設定此屬性的同時會在webview中註入一個postMessage的全域函數並覆寫可能已經存在的同名實作。
網頁端的window.postMessage只會傳送一個參數data,此參數封裝在RN端的event物件中,即event.nativeEvent.data。 data只能是一個字串。
由此可見,這個方法是用來接收從Webview(也就是html)中傳來資料的方法.
內部實作是對接收到的資料進行處理:
handleMessage(e) { this.setState({webViewData: e.nativeEvent.data}); }
e.nativeEvent.data就是從webview內部發送過來的資料.
#
var data = 0; function sendData(data) { if (window.originalPostMessage) { window.postMessage(data); } else { throw Error('postMessage接口还未注入'); } } document.getElementById('button').onclick = function () { data += 100; sendData(data); }
#二: RN傳送資料給Webview:
先定義一個傳送資料的方法:
sendMessage() { this.refs.webview.postMessage(++this.data); }
然後, 在html中也要有對應的接收資料的方法:
window.onload = function () { document.addEventListener('message', function (e) { document.getElementById('data').textContent = e.data; }); }
<!DOCTYPE html> <html lang="en"> <head> <title></title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <p style="text-align: center"> <button id="button">发送数据到react native</button> <p style="text-align: center">收到react native发送的数据: <span id="data"></span></p> </p> <script> var data = 0; function sendData(data) { if (window.originalPostMessage) { window.postMessage(data); } else { throw Error('postMessage接口还未注入'); } } window.onload = function () { document.addEventListener('message', function (e) { document.getElementById('data').textContent = e.data; }); document.getElementById('button').onclick = function () { data += 100; sendData(data); } } </script> </body> </html>
/** * Created by 卓原 on 2017/8/17. * zhuoyuan93@gmail.com */ import React from 'react'; import { View, Text, StyleSheet, WebView } from 'react-native'; export default class Web extends React.Component { constructor(props) { super(props); this.state = { webViewData: '' } this.data = 0; } sendMessage() { this.refs.webview.postMessage(++this.data); } handleMessage(e) { this.setState({webViewData: e.nativeEvent.data}); } render() { return ( <View style={styles.container}> <View style={{width: 375, height: 220}}> <WebView ref={'webview'} source={require('./index.html')} style={{width: 375, height: 220}} onMessage={(e) => { this.handleMessage(e) }} /> </View> <Text>来自webview的数据 : {this.state.webViewData}</Text> <Text onPress={() => { this.sendMessage() }}>发送数据到WebView</Text> </View> ) } } const styles = StyleSheet.create({ container: { flex: 1, marginTop: 22, backgroundColor: '#F5FCFF', }, });
以上是關於react native與webview通信的詳細內容。更多資訊請關注PHP中文網其他相關文章!