封装自适应高度的webView
import React, { Component } from 'react';
import {
Text,
WebView,
ScrollView,
PixelRatio,
View,
Platform,
ActivityIndicator,
} from 'react-native';
let thisWebView=null;
export default class WebViewAutoheight extends Component {
constructor(e){
super(e);
this.state={
defWebViewHeight:0,
}
}
pxToDp(px) {
return px;
}
_onLoadEnd(){
const script = `window.postMessage(document.body.scrollHeight)`;
thisWebView && thisWebView.injectJavaScript(script);
}
_onMessage (e) {
let valToInt= parseInt(e.nativeEvent.data);
let defWebViewHeight=this.pxToDp(valToInt);
if(defWebViewHeight != this.state.defWebViewHeight) this.setState({defWebViewHeight});
}
//注入html代码让h5调用
_getInjectedJavaScript(){
const patchPostMessageFunction = ()=> {
let originalPostMessage = window.postMessage;
let patchedPostMessage = (message, targetOrigin, transfer)=> {
originalPostMessage(message, targetOrigin, transfer);
};
patchedPostMessage.toString =()=> {
return String(Object.hasOwnProperty).replace('hasOwnProperty', 'postMessage');
};
window.postMessage = patchedPostMessage;
};
return '(' + String(patchPostMessageFunction) + ')();';
}
renderLoadingView(){
if(this.state.defWebViewHeight == 0){
return (
<View style={
{ alignItems:"center"}}>
<ActivityIndicator
animating={
true}
style={
{
height: 80,width:80, }}
size="large"
/>