React Native 从零单排8 html通信
2021-05-15 本文已影响0人
房祥_a7f1
RN版本:0.64
系统:Win10
前言
开发RN应用的的时候,遇到过一个问题,由于业务比较复杂,页面数据比较庞大,在操作工程中会遇到页面re-render过度的情况,但是优化起来也很难,于是想到用WebView内嵌html的方式来处理这个页面避免re-render,以提升性能。
在这个过程中势必要用到React Native和html页面之间的通信,这里分享一下
React Native向html页面发送消息:
- react native页面
import React, {Component} from 'react';
import {
View,
} from 'react-native';
import {WebView} from 'react-native-webview';
export default class Demo extends Component {
constructor(props) {
super(props);
this.state = {
info: null,
};
}
render() {
const that = this;
return (
<View>
<WebView
ref={webview => {
that.webview = webview;
}}
source={require('./index.html')}
javaScriptEnabled={true}
allowUniversalAccessFromFileURLs={true}
allowFileAccess={true}
originWhitelist={['*']}
onMessage={e => {
this.handleMessage(e);
}}
onLoadStart={() => {}}
onError={e => {
global.Toast(e.message);
}}
/>
</View>
);
}
// 向html发送消息
postMessage(data) {
const script = "window.onMessage('" + data + "')";
try {
this.webview.injectJavaScript(script);
} catch (e) {
setTimeout(() => {
this.postMessage(data);
}, 2000);
}
}
// 接收html消息并处理
handleMessage(e) {
try {
let data = global.JParse(e.nativeEvent.data);
console.log(data);
} catch (e) {
console.warn(e);
}
}
}
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<meta
name="viewport"
content="width=device-width, initial-scale=1.0,maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"
/>
</head>
<body>
<script>
//发送消息给RN
function postMessage(data) {
window.ReactNativeWebView.postMessage(data)
}
//处理RN传过来的消息
window.onMessage = function(msgStr) {
try {
var msg = JSON.parse(msgStr)
} catch (e) {
alert(e.message);
}
}
</script>
</body>
</html>