react native与webview通信的示例代码
程序员文章站
2022-09-08 15:47:04
webview是reactnative中的组件 , 它可以创建一个原生的webview,可以用于访问一个网页.
有时候我们需要在rn与webview之间进行通信,或者...
webview是reactnative中的组件 , 它可以创建一个原生的webview,可以用于访问一个网页.
有时候我们需要在rn与webview之间进行通信,或者进行数据传递,或者发送消息通知.这时候就要用以下知识了.
一:webview向rn端发送数据:
首先,我们构建一个webview:
<webview ref={'webview'} source={require('./index.html')} style={{width: 375, height: 220}} onmessage={(e) => { this.handlemessage(e) }} />
可以看到其中有一个onmessage方法,
onmessage function
在webview内部的网页中调用window.postmessage方法时可以触发此属性对应的函数,从而实现网页和rn之间的数据交换。 设置此属性的同时会在webview中注入一个postmessage的全局函数并覆盖可能已经存在的同名实现。
网页端的window.postmessage只发送一个参数data,此参数封装在rn端的event对象中,即event.nativeevent.data。data只能是一个字符串。
由此可见,这个方法是用来接收从webview(也就是html)中传来数据的方法.
内部实现是对接收到的数据进行处理:
handlemessage(e) { this.setstate({webviewdata: e.nativeevent.data}); }
e.nativeevent.data就是从webview内部发送过来的数据.
光做这个还不 够, 这只是rn端的处理,我们还需要在html中写一个发送数据的方法:
var data = 0; function senddata(data) { if (window.originalpostmessage) { window.postmessage(data); } else { throw error('postmessage接口还未注入'); } } document.getelementbyid('button').onclick = function () { data += 100; senddata(data); }
window.postmessage就是向rn发送数据.
二: rn向webview发送数据:
首先定义一个发送数据的方法:
sendmessage() { this.refs.webview.postmessage(++this.data); }
这步很简单 .
直接把想发送的数据作为参数写在这个方法里就好.
然后, 在html中也要有相应的接收数据的方法:
window.onload = function () { document.addeventlistener('message', function (e) { document.getelementbyid('data').textcontent = e.data; }); }
这就可以实现rn与webview之间的通信了.
之后放上源码:
<!doctype html> <html lang="en"> <head> <title></title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div style="text-align: center"> <button id="button">发送数据到react native</button> <p style="text-align: center">收到react native发送的数据: <span id="data"></span></p> </div> <script> var data = 0; function senddata(data) { if (window.originalpostmessage) { window.postmessage(data); } else { throw error('postmessage接口还未注入'); } } window.onload = function () { document.addeventlistener('message', function (e) { document.getelementbyid('data').textcontent = e.data; }); document.getelementbyid('button').onclick = function () { data += 100; senddata(data); } } </script> </body> </html>
web.js:
/** * created by 卓原 on 2017/8/17. * zhuoyuan93@gmail.com */ import react from 'react'; import { view, text, stylesheet, webview } from 'react-native'; export default class web extends react.component { constructor(props) { super(props); this.state = { webviewdata: '' } this.data = 0; } sendmessage() { this.refs.webview.postmessage(++this.data); } handlemessage(e) { this.setstate({webviewdata: e.nativeevent.data}); } render() { return ( <view style={styles.container}> <view style={{width: 375, height: 220}}> <webview ref={'webview'} source={require('./index.html')} style={{width: 375, height: 220}} onmessage={(e) => { this.handlemessage(e) }} /> </view> <text>来自webview的数据 : {this.state.webviewdata}</text> <text onpress={() => { this.sendmessage() }}>发送数据到webview</text> </view> ) } } const styles = stylesheet.create({ container: { flex: 1, margintop: 22, backgroundcolor: '#f5fcff', }, });
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。