对于react native中的富文本的嵌入可以使用WebView,本文阐述的是作者在工作中自己遇到的问题和解决方法
1.WebView可以嵌入一段html代码,也可以嵌入一个url访问网页
例如:
<WebView
source={{uri: 'https://github.com/facebook/react-native'}}
style={{marginTop: 20}}
/>
也可以嵌入一段静态的html
render() {
const INJECTEDJAVASCRIPT = `
//高度获取
let webHeight = document.body.scrollHeight;
window.ReactNativeWebView.postMessage(webHeight);
`;
return (
<WebView
ref={'webview'}
style={{ width: '100%', height: this.state.webHeight }}
scalesPageToFit={false} //布尔值,控制网页内容是否自动适配视图的大小,同时启用用户缩放功能。默认为true
scrollEnabled={false} //控制是否在 WebView中启用滑动。默认为 true
javaScriptEnabled={true} //布尔值,控制是否启用 JavaScript。仅在安卓下使用,因为 IOS 默认为启用 JavaScript。默认值为true
//在 WebView 中载入一段静态的 html 代码或是一个 url(还可以附带一些 header 选项)
source={{
html: `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
span{
word-break:normal;
white-space:pre-wrap;
word-wrap: break-word;
}
#contentBox{
width: 100%!important;
padding: 0 5px;
box-sizing:border-box;
}
#contentBox h1{
font-size: 16px!important;
}
#contentBox p{
font-size: 14px!important;
}
img{
display: block;
width: 100%!important;
}
table {
display: block;
width: 100%!important;
overflow-x: auto;
}
</style>
</head>
<body>
<div id="contentBox">${this.state.infoContent}</div>
</body>
</html>`}}
//injectedJavaScript={INJECTEDJAVASCRIPT} //设置 js 字符串,在网页加载之前注入的一段 JS 代码
onLoadEnd={this.webViewLoaded} // webview加载完毕后执行
onMessage={(event) => {
//console.log('测试onMessage参数列表'+JSON.stringify(event.nativeEvent.data))
this.onMessage1(event)
}}
/>
)
}
webViewLoaded = () => {
this.refs.webview.injectJavaScript = `
//高度获取
let webHeight = document.body.scrollHeight;
window.ReactNativeWebView.postMessage(webHeight);
`
}
onMessage1 = (msg) => {
if (msg.nativeEvent.data !== undefined && msg.nativeEvent.data !== null) {
this.setState({
webHeight: parseInt(msg.nativeEvent.data)
})
}
}
2.使用WebView时需给其赋值高度,由于我的使用场景中高度内容不固定,所以使用了injectJavaScript注入JS,来动态获取高度,并且通过postMessage来进行传值后赋值。值得注意的是,onMessage接受参数时,需先进行判空。
以上就是本人目前在RN中使用WebView所遇到的问题和解决方法,欢迎一起讨论学习