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 相关文章推荐
jquery+ajax实现跨域请求的方法
Jan 20 Javascript
javascript实现简单的贪吃蛇游戏
Mar 31 Javascript
JavaScript对象学习小结
Sep 02 Javascript
JQuery实现简单的服务器轮询效果实例
Mar 31 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
vue.js中proxyTable 转发请求的实现方法
Sep 20 Javascript
利用jquery和BootStrap实现动态滚动条效果
Dec 03 jQuery
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
bootstrap-table+treegrid实现树形表格
Jul 26 Javascript
Nuxt使用Vuex的方法示例
Sep 06 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
Nov 08 Javascript
uniapp开发小程序的经验总结
Apr 08 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中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
cache_lite试用
2007/02/14 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
js模拟实现Array的sort方法
2007/12/11 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
傻瓜式vuex语法糖kiss-vuex整理
2018/12/21 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
vue组件系列之TagsInput详解
2020/05/14 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python中类的继承代码实例
2014/10/28 Python
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
Python面向对象特殊成员
2017/04/24 Python
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
浅谈Python处理PDF的方法
2017/11/10 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
国际会议邀请函范文
2014/01/16 职场文书
暑期研修感言
2014/02/17 职场文书
创先争优公开承诺书
2014/08/30 职场文书
机动车登记业务委托书
2014/10/08 职场文书
2014年四风个人对照检查及整改措施
2014/10/28 职场文书
小学副班长竞选稿
2015/11/21 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
MySQL 重写查询语句的三种策略
2021/05/10 MySQL