ReactNative系列之十一原生RN控件WebView与Html5之件的调用

本文介绍ReactNative 0.37后WebView的增强功能,无需第三方库即可实现与Html5的相互调用和数据传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言系列九讲解过使用第三方WebViewBridge与Html5之间的通信,但在ReatNative0.37之后,增强的WebView的功能,不需要第三方也可以原生支持互调与传递数据

2、主要代码

export default class Render extends Component {

  constructor(props) {
      super(props);
      this.state = {
        msgstr: "",
        title:"",
        simpleContent:"<!DOCTYPE html>\n<html></html>"
      };
    }

 onMessage(e)
 {
 	Alert.alert(e.nativeEvent.data);
 	//Alert.alert(this.state.simpleContent);

 	if (this.refs.webview)
 	{
 		this.refs.webview.postMessage("msg('"+e.nativeEvent.data+"')");
 	}
 	else
 	{
 		Alert.alert("error");
 	}
 }

  render () {
    //let display = this.state.showText ? this.state.strabc : ' ';
    
      return (
        <View style={styles.container}>
        <ScrollView 
        contentContainerStyle={styles.contentContainer}
        showsVerticalScrollIndicator={true}>

          <Text style={styles.hello}> {this.state.title} ,Welcome! </Text>
          
          <WebView
          ref='webview'
          onMessage={this.onMessage.bind(this)}
          automaticallyAdjustContentInsets={false}
          style={styles.webView}
          source={{ uri:'file:///android_asset/pages/nullpage.html'}}
          //injectedJavaScript={this.bootstrapJS()}
          injectedJavaScript="document.addEventListener('message', function(e) {eval(e.data);});"
          javaScriptEnabled={true}
          domStorageEnabled={true}
          decelerationRate="normal"
          startInLoadingState={true}
          scalesPageToFit={true}
        />
          </ScrollView>
        </View>
      )
  }
}
var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  },
  hello: {
    fontSize: 12,
    margin: 10,
  },
  contentContainer: {
      paddingVertical: 20
    },
    webView: {
      backgroundColor: BGWASH,
      height: 350,
    },
});

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
  <script>
      function onYeputi1015() {
        window.postMessage("Title: yeputi1015");
      }
      function msg(event) {
        document.write("event:"+event);
      }

    </script>
  <h1>Yeputi1015</h1>
  <button οnclick="onYeputi1015()">单击</button>
  </body>
</html>

### 原生开发、UniApp 和 React Native 技术栈差异 #### 1. 开发语言和技术生态 原生开发依赖于特定平台的语言和工具链。对于 Android 来说,主要采用 Java 或 Kotlin;而对于 iOS,则使用 Swift 或 Objective-C[^2]。 相比之下,UniApp 使用 JavaScript 及其衍生框架 Vue.js 进行开发,允许开发者编写一次代码即可部署到多个目标平台,包括但不限于 Android、iOS 以及各种小程序环境[^1]。 React Native 同样基于 JavaScript 构建,但它更侧重于 Facebook 推出的 React 生态系统,并且提供了接近原生的应用体验。 #### 2. 性能表现 就性能而言,原生应用程序通常能够提供最优的表现,因为这些程序直接编译成机器码并充分利用设备硬资源[^4]。 UniApp 支持两种渲染模式——WebView 和 Weex (V8引擎),这使得它能够在不同场景下灵活调整以平衡性能兼容性需求[^5]。然而,在处理复杂的图形界面或高频率更新的数据展示时,可能不如完全由本地代码构建的应用那样流畅。 React Native 虽然不是纯粹意义上的原生应用,但由于其底层架构设计尽可能多地调用了系统的原生和服务,所以在大多数情况下都能保持良好的响应速度和视觉效果。 #### 3. 用户体验一致性 为了确保一致性的用户体验,原生开发无疑是最可靠的选择之一,因为它可以直接访问操作系统提供的所有功能APIs,从而实现最贴近用户期望的操作逻辑和外观风格。 UniApp 努力弥合多端间的差距,通过抽象层来屏蔽掉部分平台特有的细节,让开发者更容易创建跨平台特性相同的应用。不过,在某些特殊定制化的场合下,仍需针对具体平台做额外适配工作[^3]。 React Native 在这方面做得相当不错,既保留了一定程度上的灵活性又不会牺牲太多的一致感。得益于丰富的社区贡献和支持,许多常见的UI控件已经被很好地移植到了RN环境中。 ```javascript // 示例:简单的按钮点击事处理(适用于 React Native) import React from 'react'; import { Button, View } from 'react-native'; export default function App() { const onPress = () => console.log('Button pressed!'); return ( <View> <Button title="Press me!" onPress={onPress} /> </View> ); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值