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 document.images实例
May 27 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
Jun 11 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
js获取当前日期代码适用于网页头部
Jun 27 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
Dec 27 Javascript
实现div内部滚动条滚动到底部和顶部的代码
Nov 15 Javascript
傻瓜式vuex语法糖kiss-vuex整理
Dec 21 Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 Javascript
解决vant中 tab栏遇到的坑 van-tabs
Nov 04 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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
php cookis创建实现代码
2009/03/16 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
WordPress中缩略图的使用以及相关技巧
2015/11/24 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
js实现图片实时时钟
2020/01/15 Javascript
python搭建微信公众平台
2016/02/09 Python
Python中pillow知识点学习
2018/04/30 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
Python中包的用法及安装
2020/02/11 Python
Python求凸包及多边形面积教程
2020/04/12 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
预备党员表决心书
2014/03/11 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
廉政承诺书2015
2015/04/28 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
教师网络培训心得体会
2016/01/09 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫