npm i react-native-webview
import { WebView } from 'react-native-webview';
WebView ref={ (webView) => this.webView = webView }
originWhitelist={ ['*'] }
javaScriptEnabled={ true }
// 开启缓存
// domStorageEnabled={ true }
thirdPartyCookiesEnabled={ true }
// 允许文件上传
allowFileAccess={ true }
onMessage={ this._onMessage }
onLoad={() => { this.handleInjectJavascript();
}} //初始化调用方法
useWebKit={true}
// 加载时强制使用loading转圈视图,注意如果为true,在低性能下,webview可能会加载失败,显示为空白
startInLoadingState={false}
// webview加载错误页面
renderError={this.renderErrorView} // 页面无网络报错调用方法
source={ {uri: 'http://www.baidu.com/'} } // 网络路径
// source={ {uri: 'http://192.168.1.1111:8080/'} } //本地路径
/>
onLoad 函数
在webview初始化source前执行的函数,通常是调用一个方法
onLoad={() => { this.handleInjectJavascript('hello,vue'); }}
**handleInjectJavascript()**方法才是真正用于给 Vue 或者 Html 页面发送数据
//RN webview 向 vue发送数据
handleInjectJavascript = (data) => {
const injectJavascriptStr = `(function() {
window.WebViewBridge.onMessage(${JSON.stringify(data)});
})()`; // 拼接 数据 为 方法
if(this.webView) {
this.webView.injectJavaScript(injectJavascriptStr)
} // 通过 injectJavaScript 将 数据 传递给WebView页面,并立即执行为js
}
mounted() {
window.WebViewBridge = {
onMessage: this._onMessage //在window上挂载一个onMessage方法,RN会调用
}
const event = new Event('WebViewBridge')
window.dispatchEvent(event);
},
methods: {
// 接收rn发送消息
_onMessage(data) {
let that = this;
console.log('data ------- ',JSON.stringify(data)); // 'hello,vue'
}
}
注意: react native 页面 初始化 字面量的 拼接方法名 onMessage 必须跟 vue页面的 mounted() 中 onMessage:this._onMessage 一致
解释:rn中 给 window.WebViewBridge 增加一个名为 onMessage 的方法,vue初始化页面会对应给出onMessage 指向的方法,在此代码块 指向 _onMessage 方法
mounted() {
const event = new Event('WebViewBridge')
window.dispatchEvent(event);
},
methods: {
// 向rn发送消息
_postMessage('wow,RN!!') {
window.ReactNativeWebView.postMessage(data);
// 将值 'wow,RN!!' 挂载到 postMessage
}
}
onMessage 函数
在接收到 vue 传输的数据之后 执行的方法
onMessage={ this._onMessage }
_onMessage方法获取 Vue 或者 Html 页面返回的 数据
// 接受vue发送来的消息
_onMessage = (event) => {
console.log('接收vue发来的消息onMessage', event.nativeEvent.data);
// '接收vue发来的消息onMessage wow,RN!!'
}
基于 vue -> rn 拓展
mounted() {
window.WebViewBridge = {
onMessage: this._onMessage,
receiveMessage: this._receiveMessage //在window上挂载一个receiveMessage方法,RN自行调用
}
const event = new Event('WebViewBridge')
window.dispatchEvent(event);
},
methods: {
// 向rn发送消息
_postMessage('wow,RN!!') {
window.ReactNativeWebView.postMessage(data);
// 将值 'wow,RN!!' 挂载到 postMessage
},
// 二次或多次接收rn发送消息
_receiveMessage(data){
let that = this;
console.log('data receiveMessage------- ',JSON.stringify(data));
}
}
onMessage 函数
在接收到 vue 传输的数据之后 执行的方法
onMessage={ this._onMessage }
_onMessage方法获取 Vue 或者 Html 页面返回的 数据
// 接受vue发送来的消息
_onMessage = (event) => {
console.log('接收vue发来的消息onMessage', event.nativeEvent.data);
// '接收vue发来的消息onMessage wow,RN!!'
const injectJavascriptStr = `(function() {
window.WebViewBridge.receiveMessage(${JSON.stringify('hello,vue2!!! ')});
})()`;
this.webView.injectJavaScript(injectJavascriptStr);
}
参考文档:
3.问题解决库