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的console.log()用法小结
May 31 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
Jan 16 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
JavaScript插件化开发教程 (二)
Jan 27 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
Aug 05 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
Jan 25 Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 Javascript
JsonServer安装及启动过程图解
Feb 28 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 Javascript
Vue 构造选项 - 进阶使用说明
Aug 14 Javascript
ajax jquery实现页面某一个div的刷新效果
Mar 04 jQuery
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教程 基本语法
2009/10/23 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
通过action传过来的值在option获取进行验证的方法
2013/11/14 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
angular json对象push到数组中的方法
2018/02/27 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
python脚本生成caffe train_list.txt的方法
2018/04/27 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
详解django2中关于时间处理策略
2019/03/06 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
2020/07/20 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
店长岗位的工作内容
2013/11/12 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
暑期教师培训方案
2014/06/07 职场文书
外贸英文求职信范文
2015/03/19 职场文书
特种设备安全管理制度
2015/08/06 职场文书
小学校园广播稿
2015/08/18 职场文书
600字作文之感受大自然
2019/11/27 职场文书
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
Java详细解析==和equals的区别
2022/04/07 Java/Android