react native与webview通信的示例代码


Posted in Javascript onSeptember 25, 2017

WebView是ReactNative中的组件 , 它可以创建一个原生的WebView,可以用于访问一个网页.

有时候我们需要在RN与WebView之间进行通信,或者进行数据传递,或者发送消息通知.这时候就要用以下知识了.

react native与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',
  },

});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript设计模式之解释器模式详解
Jun 05 Javascript
js实现简单的联动菜单效果
Aug 19 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
Nov 17 Javascript
JQuery中Ajax()的data参数类型实例分析
Dec 15 Javascript
JQuery控制DIV的选取实现方法
Sep 18 Javascript
JS实现根据用户输入分钟进行倒计时功能
Nov 14 Javascript
Bootstrap表格使用方法详解
Feb 17 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
Vue.js项目模板搭建图文教程
Sep 20 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
Sep 25 #Javascript
vuex中使用对象展开运算符的示例
Sep 25 #Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 #Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 #Javascript
Three.js入门之hello world以及如何绘制线
Sep 25 #Javascript
es6系列教程_ Map详解以及常用api介绍
Sep 25 #Javascript
简单谈谈js的数据类型
Sep 25 #Javascript
You might like
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
兼容FireFox 的 js 日历 支持时间的获取
2009/03/04 Javascript
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
AngularJS基础 ng-submit 指令简单示例
2016/08/03 Javascript
domReady的实现案例
2016/11/23 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[44:41]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
python pandas模块基础学习详解
2019/07/03 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
YUV转为jpg图像的实现
2019/12/09 Python
使用Python实现音频双通道分离
2020/12/25 Python
python re模块常见用法例举
2021/03/01 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
世博会口号
2014/06/20 职场文书
2014年设计师工作总结
2014/11/25 职场文书
刑事辩护词范文
2015/05/21 职场文书
信仰观后感
2015/06/03 职场文书
《落花生》教学反思
2016/02/16 职场文书
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
Python tensorflow卷积神经Inception V3网络结构
2022/05/06 Python