# ReactNativeWebViewLoadHTML
**Repository Path**: scenario-samples/react-native-web-view-load-html
## Basic Information
- **Project Name**: ReactNativeWebViewLoadHTML
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-04
- **Last Updated**: 2026-03-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 场景介绍
在现代移动应用开发中,react-native-webview组件作为连接React Native应用与Web技术的桥梁,在多种业务场景中发挥着重要作用。尤其是在需要展示动态内容、集成第三方服务或实现复杂交互界面时,WebView提供了灵活高效的解决方案。
## 效果预览

## 实现思路
- react-native-webview加载本地HTML文件的不同方式:
```js
const [webViewSource, setWebViewSource] = useState({ html:htmlContent });
```
- 直接加载HTML字符串时,需要显式定义HTML内容,并设置source={html:htmlContent}:
```js
const htmlContent = `HTML文件内容`;
const loadHTMLContent = () => {
setWebViewSource({ html: htmlContent });
};
```
- 加载React Native侧的目录中的HTML时,将HTML文件放在React Native侧的目录中,设置source={require('./xxx/xxx.html')}:
```js
const loadRNAssetsFile = () => {
let rnAssetsfilePath =require('./assets/rn-assets.html');
setWebViewSource(rnAssetsfilePath);
};
```
- 加载HarmonyOS侧的rawfile目录中的HTML时,将HTML文件放在HarmonyOS侧的rawfile目录中,设置source={uri:resource://rawfile/xxx.html}:
```js
const loadRawFile = () => {
let rawfilePath ='resource://rawfile/rawfile_test.html';
setWebViewSource({uri:rawfilePath});
};
```
- 加载沙箱目录中的HTML时,将HTML文件放在应用的沙箱目录的files目录中,设置source={uri:file:///data/storage/el2/base/haps/entry/files/xxx.html}:
```js
const loadSandboxFile = () => {
let sandboxPath = 'file:///data/storage/el2/base/haps/entry/files/sandbox.html';
setWebViewSource({ uri: sandboxPath });
};
```
- 设置完成source源后加载HTML:
```js
addLog('开始加载')} // 页面开始加载时触发。
onLoadEnd={() => addLog('加载完成')} // 页面加载完成时触发(无论成功或失败)。
onError={(event) => {}} // 页面加载失败时触发。
onHttpError={(event) => { addLog('HTTP错误');}} // HTTP错误时触发。
/>
```
- HTML页面与React Native通信:
- React Native侧接收来自HTML页面的消息:
```js
const onWebViewMessage = (event) => {
try {
const data = JSON.parse(event.nativeEvent.data);
console.info('RN收到消息:', data);
// 接收HTML发送的消息(type:FROM_H5)
if (data.type === 'FROM_H5') {
addLog(`收到HTML消息: ${data.data || data.message}`);
Alert.alert('HTML消息', data.data || data.message);
}
// 接收页面加载完成消息
else if (data.type === 'PAGE_LOADED') {
addLog(`${data.page}页面加载完成`);
}
} catch (error) {
console.info('RN收到原始消息:', event.nativeEvent.data);
}
};
```
- React Native向HTML发送消息:
```js
const sendMessageToH5 = () => {
const message = {
type: 'FROM_RN',
data: {
message: `Hello from RN @ ${new Date().toTimeString().split(' ')[0]}`,
timestamp: Date.now(),
platform: Platform.OS
}
};
// 方式1:使用postMessage
webViewRef.current?.postMessage(JSON.stringify(message));
// 方式2:使用injectJavaScript
webViewRef.current?.injectJavaScript(`
if (typeof window.receiveRNMessage === 'function') {
window.receiveRNMessage(${JSON.stringify(message)});
}
`);
addLog('发送消息到HTML');
};
```
- WebView加载JavaScript和CSS资源文件时,同时设置javaScriptEnabled、allowFileAccess、domStorageEnabled为true:
```js
allowFileAccess={true} // 解除对本地文件的访问限制,允许加载同目录或指定路径的JS/CSS文件。
javaScriptEnabled={true} // 确保JS代码能够执行,否则即使文件加载成功,代码也无法运行。
domStorageEnabled={true} // 不直接控制资源加载,但确保JS代码运行时所需的存储功能,避免因存储缺失导致的逻辑错误。
```
## 约束与限制
- 本示例支持API Version 20 Release及以上版本。
- 本示例支持HarmonyOS 6.0.0 Release SDK及以上版本。
- 本示例需要使用DevEco Studio 6.0.0 Release及以上版本进行编译运行。
- 本示例使用0.77.33版本RNOH。
- 本示例使用13.15.1版本react-native-ohos/react-native-webview。
## 工程目录
```
ReactNativeWebViewLoadHTML // RN工程
├──harmony // harmony工程
│ ├──entry/src/main/cpp // native相关配置
│ │ ├──generated // codegen自动生成的桥接代码
│ │ │ └──RNOHGeneratedPackage.h
│ │ ├──CMakeLists.txt
│ │ └──PackageProvider.cpp
│ ├──entry/src
│ │ ├──main/ets
│ │ │ ├──entryability
│ │ │ │ └──EntryAbility.ets
│ │ │ ├──pages
│ │ │ │ └──Index.ets // Harmony侧入口
│ │ │ └──RNPackagesFactory.ets
│ │ └──module.json5
│ └──entry/src/main/resources/rawfile
│ ├──rawfile_test.html // HarmonyOS侧rawfile测试HTML
│ ├──style.css // CSS测试HTML
│ └──sandbox.html // 沙箱目录测试HTML
├──App.tsx // WebView加载本地HTML实现
├──assets
│ ├──communication-test.html // 通信测试HTML
│ └──rn-assets.html // RN侧require测试HTML
├──index.js // 入口文件
├──metro.config.js // 打包配置
```
## 参考文档
[RNOH使用文档](https://gitcode.com/openharmony-sig/ohos_react_native/blob/tag_0.77.33/README.md)
[react-native-ohos/react-native-webview](https://gitee.com/react-native-oh-library/usage-docs/blob/master/zh-cn/react-native-webview.md)