ReactNative WebView组件详解

2023-11-01

源码传送门
在开发Android的时候,一般我们会有一些加载网页的需求,或者执行一些JavaScript,我们都知道在Android中实现这个功能的控件是WebView,在ReactNative中也有实现此类需求额的组件,它的名字也是WebView。那么今天的这篇文章就来详细说说在ReactNative WebView的使用。本文示例效果图

webview.gif

属性

  • automaticallyAdjustContentInsets
    控制是否调整放置在导航条、标签栏或工具栏后面的web视图的内容。默认值为true
  • contentInset {top: number, left: number, bottom: number, right: number}
    设置网页内嵌边距
  • injectedJavaScript
    设置在网页加载之前注入一段js代码
  • mediaPlaybackRequiresUserAction
    设置页面中的HTML5音视频是否需要在用户点击后再开始播放。默认值为true
  • scalesPageToFit
    设置是否要把网页缩放到适应视图的大小,以及是否允许用户改变缩放比例。
  • source
    在WebView中指定加载内容html或者url,可以指定header,method等
  • startInLoadingState
    强制WebView在第一次加载时先显示loading视图。默认为true
  • domStorageEnabled(android)
    布尔值,指定是否开启DOM本地存储
  • javaScriptEnabled(android)
    布尔值,指定WebView中是否启用JavaScript。只在Android上使用,因为在iOS上默认启用了JavaScript。
  • mixedContentMode(android)
    指定混合内容模式。即WebView是否应该允许安全链接(https)页面中加载非安全链接(http)的内容,

    • ’never’ (默认) - WebView不允许安全链接页面中加载非安全链接的内容
    • ‘always’ - WebView允许安全链接页面中加载非安全链接的内容。
    • ‘compatibility’ - WebView会尽量和浏览器当前对待此情况的行为一致
  • userAgent(android)
    为WebView设置user-agent字符串标识。这一字符串也可以在原生端用WebViewConfig来设置,但js端的设置会覆盖原生端的设置。

  • allowsInlineMediaPlayback(ios)
    指定HTML5视频是在网页当前位置播放还是使用原生的全屏播放器播放。 默认值为false,视频在网页播放还需要设置webkit-playsinline
  • bounces(ios)
    指定滑动到边缘后是否有回弹效果。
  • decelerationRate(ios)
    指定一个浮点数,用于设置在用户停止触摸之后,此视图应以多快的速度停止滚动。也可以指定预设的字符串值,如”normal”和”fast”,
  • scrollEnabled(ios)
    是否启用滚动

函数

  • injectJavaScript
    函数接受一个字符串,该字符串将传递给WebView,并立即执行为JavaScript
  • onError
    加载失败时回调
  • onLoad
    完成加载时回调
  • onLoadEnd
    加载成功或者失败都会回调
  • onLoadStart
    开始加载的时候回调
  • onMessage
    在webView内部网页中,调用window.postMessage可以触发此属性对应的函数,通过event.nativeEvent.data获取接收到的数据,实现网页和RN之间的数据传递
  • renderError
    返回一个视图用来提示用户错误
  • renderLoading
    返回一个加载指示器
  • onShouldStartLoadWithRequest(ios)
    请求自定义处理,返回true或false表示是否要继续执行响应的请求

实战分析

通过上面的介绍,我们已经对组件的属性以及函数有了大致的了解,当然只有这些是不够的,接下来就该组件的使用展开分析,效果图如文章开头的GIF图。对于该组件最简单的使用如下

        <WebView
                source={{uri:'http://www.jianshu.com/u/d5b531888b2b'}}
                style={{width:'100%',height:'100%'}}
            />

指定source属性,加载网页,设置宽和高全屏,需要注意的是必须指定宽和高,否则将不显示组件,默认宽高都是0。
给WebView增加加载时的回调

                    onLoad={(e) => console.log('onLoad')}
                    onLoadEnd={(e) => console.log('onLoadEnd')}
                    onLoadStart={(e) => console.log('onLoadStart')}
                    renderError={() => {
                        console.log('renderError')
                        return <View><Text>renderError回调了,出现错误</Text></View>
                    }}
                    renderLoading={() => {
                        return <View><Text>这是自定义Loading...</Text></View>
                    }}

renderError可以自定义加载错误的提示信息View.当加载错误时会回调该函数,并且显示该函数返回的View。使用此方法我们可以自定义加载错误时的提示信息。
而renderLoading函数可以自定义加载提示.当我们通过WebView加载一个网页时,往往我们有需求展示出请求的url,网页的标题,以及是否可前进或者后退。在WebView组件中有一个函数onNavigationStateChange可以实现此功能,他是在加载开始和结束的时候回调的,

   //添加属性
   onNavigationStateChange={this._onNavigationStateChange}

    _onNavigationStateChange = (navState) => {
        console.log(navState)
        this.setState({
            backButtonEnabled: navState.canGoBack,
            forwardButtonEnabled: navState.canGoForward,
            url: navState.url,
            status: navState.title,
            loading: navState.loading,
        });
    }

当canGoBack返回值为true时,我们就可以使用this.webview.goBack();(this.webview是WebView的引用)对网页进行回退操作,同理当canGoForward为true时我们就可以使用 this.webview.goForward();对我们的网页进行跳转操作。当我们的网页url发生改变时我们可以使用 this.webview.reload();加载新的网页。

加载HTML

     <WebView>
            style={{width:'100%',height:'100%'}}
            source={require('./helloworld.html');}
     </WebView>

RN和Html通信

当WebView加载html时我们可以实现html和rn之间的通信。rn向html发生数据可以通过postMessage函数实现。如下

this.webview.postMessage('"Hello" 我是RN发送过来的数据');
//在html中注册事件接收rn发过来的数据并显示在html中
    document.addEventListener('message', function(e) {
      messagesReceivedFromReactNative += 1;
      document.getElementsByTagName('p')[0].innerHTML =
        '从React Native接收的消息: ' + messagesReceivedFromReactNative;
      document.getElementsByTagName('p')[1].innerHTML = e.data;
    });

在html中我们定义了一个按钮,并添加事件向rn发送数据

   //window.postMessage向rn发送数据
    document.getElementsByTagName('button')[0].addEventListener('click', function() {
      window.postMessage('这是html发送到RN的消息');
    });

当html中调用了window.postMessage函数后,WebView的onMessage函数将会被回调,用来处理html向rn发送的数据,可以通过e.nativeEvent.data获取发送过来的数据。

    //接收HTML发出的数据
    _onMessage = (e) => {
        this.setState({
            messagesReceivedFromWebView: this.state.messagesReceivedFromWebView + 1,
            message: e.nativeEvent.data,
        })
        Alert.alert(e.nativeEvent.data)
    }

JavaScript

在android这个需要使用 javaScriptEnabled属性来支持JavaScript,ios默认是支持的,没有此属性。在WebView中提供了函数injectJavaScript(String),它有一个字符串参数,可以向webview中注入脚本,如下

    //脚本注入
    injectJS = () => {
        const script = 'document.write("Injected JS ")';  // eslint-disable-line quotes
        if (this.webview) {
            this.webview.injectJavaScript(script);
        }
    }

最后需要注意的一点,ScrollView中嵌套WebView时滑倒会有冲突,需要特殊处理(目前还没研究处理方法。)今天的这篇文章就介绍这么多,所介绍的实例中,只提供了核心代码,如果想查看全部代码可以访问GitHub,由于认知有限,若有错误的地方欢迎指出,共同进步,谢谢。

最后补充:

ReactNative WebView实现Android端图片和视频的拍摄和选择,以及ios,android根据webView内容自动设置高度(WebView嵌套在ScrollView中问题),修复现在Android端WebView偶先的闪退bug,插件地址https://github.com/xiehui999/react-native-webview-plugin.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactNative WebView组件详解 的相关文章

  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • 开始使用 Honeycomb 进行 Android 开发 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从代码动态更改多个文本视图的大小(没有“磁盘上”xml 主题)?

    我有 10 个文本视图在我的代码中 我想更改所有代码的字体大小 在我的布局中我使用了 style定义通用属性 但是我不知道一旦布局出现在屏幕上如何从代码中更改它们 我不想做的是更新 AND 对象 但只写在一处 我知道我可以使用应用主题但这假
  • Facebook Android 意图

    我对这个意图有疑问 这个意图是发送文本类型的消息 一切正常 电子邮件 短信 推特以及手机上的任何内容 但唯一有问题的是facebook 它会尝试以链接而不是文本的形式发布 Intent s new Intent android conten
  • Android - 主页按钮发出什么意图?

    我想知道设备的主页按钮到底执行什么操作 即 当您单击主页按钮时会发出什么意图 意图类别和操作 回到空白的主屏幕 我想知道在单击我自己的自定义按钮时实现此操作涉及什么 谢谢 PS我知道这不是标准的 但我的设备也不是 如果您想显示主屏幕 可以通
  • 如何检查元素的内容是否为空,如果是,则在 jquery 中删除该元素

    我目前正在尝试选择某个 div 内没有内容的任何 h2 元素并将其删除 这是我的 html 代码 div class skipToContainer h2 class vidSkipTo Hello h2 h2 class vidSkipT
  • 浏览器默认区域设置 - Intl.DateTimeFormat 与 navigator.language

    在对网站进行编码并格式化日期时 我想使用用户在浏览器中设置的区域设置 例如 如果用户定制了他们的chrome settings languages在 Chrome 中设置为非默认值 这就是我想要使用的值 但是 当我在此类浏览器的控制台中运行
  • Phonegap facebook 插件:android 的各种问题

    我正在尝试将 Phonegap 3 1 与 Phonegap facebook plugin 集成 以使我的应用程序能够使用 facebook 登录 https github com phonegap phonegap facebook p
  • 使用 qbs 构建 qt 应用程序

    我想知道在 Linux 上使用 qbs 编译 构建和创建 Android Qt 应用程序的步骤 我拥有所有必要的工具 目前我可以使用 qmake 创建 apk Qbs 目前不支持构建 Qt Android 应用程序 Qbs v1 4 中引入
  • JavaScript 访问密码字段值是否被视为存在安全风险?

    如果安全 正确地存储密码是良好的风格和安全性 那么对于要求用户输入密码的网页来说不应该也是如此吗 考虑这个例子
  • 仅在首页加载时使用 cookie 加载 colorbox

    我尝试了来自网络的参考代码 仅在页面加载时加载特定元素一次 这是示例代码
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 读/写带有特殊字符的.txt文件

    I open Notepad Windows 并写 Some lines with special characters Special 并前往另存为 someFile txt 与Encoding set to UTF 8 在Java中我有
  • 父指令属性更改时子指令不会更新

    这是对这两个问题的后续 在父指令和子指令之间传递参数 https stackoverflow com questions 42814530 pass argument between parent and child directives
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 如何使用 Jest 测试对象键和值的相等性?

    我有一个mapModule我在其中导入组件并导出它们 import ComponentName from components ComponentName export default name ComponentName 我该如何测试ma
  • JavaScript 中最长的通用前缀

    我正在尝试解决 Leet Code 挑战14 最长公共前缀 https leetcode com problems longest common prefix 编写一个函数来查找字符串数组中最长的公共前缀字符串 如果没有公共前缀 则返回空字
  • 如何将QR码中的3个方块替换为圆圈以使用Paint android使用zxing自定义QR码?

    我用它作为自定义的参考 从方形到圆形使用zxing生成的QR码它是在java中所以我尝试将它转换为在android中使用 使用 zxing 生成具有自定义点形状的 QR 码 https stackoverflow com questions
  • 使用 JQuery 预填充选择字段的下拉选项验证

    我有这个 JQuery 片段来防止选择已在另一个字段中选择的下拉选项 var coll select name service on change function coll each function var val this value

随机推荐

  • 普通大专真的可以自学 Java 吗?

    能是肯定能 看数据先 全国范围内搜索Java筛选大专学历 1到 3年工作经验 找到了1177条消息 但是其他条件不变 更改本科呢 全国范围内搜索到了3215条招聘消息 有人说什么90 以上都要本科 确实有点片面了 当然现在也不是招聘旺季 已
  • HashMap的底层实现。(05)

    HASHMAP的简介 通过学习本文档后能够掌握到的知识点 1HashMap的简单介绍 2HashMap的主要方法 3模仿JAVA写一个简单的HASHMAP 子曰 学而不思则罔 思而不学则殆 1 为什么学HASHMAP 作为MAP接口下面一个
  • springboot学习(七)Thymeleaf模板引擎

    模板引擎 springboot我们目前是以jar包的形式打包 实际上我们之前是打成war包 放到tomcat服务器里面 可以用JSP 但是jar包就导致不能用JSP 换一种方式就是springboot推荐的Thymeleaf模板引擎 JSP
  • npm 换淘宝源

    npm config get registry npm config set registry https registry npm taobao org
  • cURL安装和常用实例

    cURL是一个利用URL语法在命令行下工作的文件传输工具 配置后 可以在命令行直接执行各类操作 也可以作为源码包 载入到各类后端开发 为后端提供文件传输能力 安装 下载 演示电脑是win10 64位 下载对应的包 全部下载地址 zip地址
  • Hibernate中枚举Enum类型的映射策略

    在Java中Enum是一种 奇葩 的存在 奇葩 不代表没用 对于这种比较特殊的存在 hibernate会有很多种选择来完成Enum类型字段的映射 首先要说明的是在hibernate都是把Enum类型的字段映射成基本类型的字段 并且我这里不使
  • moviepy音视频开发:音频剪辑基类AudioClip详解

    前往老猿Python博文目录 一 背景知识介绍 1 1 声音三要素 音调 人耳对声音高低的感觉称为音调 也叫音频 音调主要与声波的频率有关 声波的频率高 则音调也高 音量 也就是响度 人耳对声音强弱的主观感觉称为响度 响度和声波振动的幅度有
  • AIGC发展路径思考:大模型工具化普及迎来新机遇

    来源 腾讯科技 摘要 当前 AIGC引发社会关注 尤其是大模型和开源模式的推动 让AIGC有望成为AI应用落地的新领域 一方面大模型和开源加速降低AIGC应用门槛并拓展应用范围 另一方面AI与创新的界限进一步模糊 两者融合的趋势愈发明显 本
  • Python 多线程 run() 与 start()的关系

    先说结论 1 调用多线程时用start 2 start 中会调用run 3 run 不会启动多线程 代码分析 1 首先看run 的代码 def run self Method representing the thread s activi
  • 二阶系统参数用matlab,实验一基于MATLAB的二阶系统动态性能分析

    实验一 基于MATLAB 的二阶系统动态性能分析 一 实验目的 1 观察学习二阶控制系统的单位阶跃响应 脉冲响应 2 记录单位阶跃响应曲线 脉冲响应曲线 3 掌握时间响应分析的一般方法 4 掌握系统阶跃响应曲线与传递函数参数的对应关系 二
  • sqoop入门

    大数据技术之Sqoop 一 Sqoop简介 Sqoop是hdfs hive hbase和RDBMS结构化数据库之间传输大量数据的工具 二 Sqoop原理 将导入或导出命令翻译成mapreduce程序来实现 在翻译出的mapreduce中主要
  • Linux常用命令介绍(一)——文件与文件夹操作相关命令

    今天继续给大家介绍Linux相关操作 本文主要内容是文件和文件夹的基本操作 包括创建 复制 删除 以及压缩和解压缩命令 一 创建文件 夹 mkdir命令用于创建文件夹 在使用时 我们常常跟 p参数 表示强制创建 没有该参数 则必须目标文件夹
  • ESP32中定时计数器的使用

    一 GPIO常用函数 esp err t gpio reset pin gpio num tgpio num 将 gpio 重置为默认状态 选择 gpio 功能 启用上拉并禁用输入和输出 备注此功能还将此引脚的 IOMUX 配置为 GPIO
  • shiro标签页点击报错: No SecurityManager accessible to the calling code...

    shiro按钮配置标签报错问题 问题 最近的项目需要将按钮也动态配置进去 我按照网上的步骤加上shiro的taglib标签 然后在该页面的某个按钮上加上
  • vue3项目(八)---购物车

    1 购物车业务逻辑梳理拆解 1 整个购物车的实现分为俩个大分支 本地购物车操作和接口购物车操作 2 由于购物车数据的特殊性 采取Pinia管理购物车列表数据并添加持久化缓存 2 本地购物车 加入购物车实现 1 封装cartStore 在st
  • 正则表达式 匹配6到20位含字母和数字

    A Za z0 9 6 20 分别匹配字符串的开始和结束 d a z A Z a zA Z d 6 20 a z A Z a zA Z d 6 20 d 表示字符串中有数字 a z A Z 则分别表示字符串中含有小写字母和大写字母 例如 a
  • 使用R语言绘制散点图是一种常见的数据可视化方法,可以帮助我们观察和分析数据的分布情况

    使用R语言绘制散点图是一种常见的数据可视化方法 可以帮助我们观察和分析数据的分布情况 在散点图中添加自定义文本标签可以进一步丰富图表的信息内容 本文将介绍如何使用R语言的plot函数和mtext函数来创建散点图并添加自定义文本标签 首先 我
  • 域名解析--详细讲解

    1 域名是什么 比如 www baidu com 这一串东西就是域名 2 那么我们买的域名 直接输入到浏览器的地址栏 访问 却什么都没有 是因为域名形象的说只是一个门牌号而已 所以需要将域名解析到服务器 3 怎么解析 以下以阿里云网站操作为
  • 小白入门脑电信号

    是个脑电信号研究小白 今年3月下旬临时换了研究方向 到现在也看了不少论文 试过一些特征提取的代码还有分类的代码 现在也想总结一下这段时间所学的东西 算是做个中期回顾吧 Ps 里面的特征提取的代码以及分类的代码均不是我所写的 后面会附上链接
  • ReactNative WebView组件详解

    源码传送门 在开发Android的时候 一般我们会有一些加载网页的需求 或者执行一些JavaScript 我们都知道在Android中实现这个功能的控件是WebView 在ReactNative中也有实现此类需求额的组件 它的名字也是Web