react-native-webview RN和html双向通信

rn登录后得到的token需要传递给网页,js获取到的浏览器信息需要传递给rn

RN Index.js:

import React from 'react'
import { WebView } from 'react-native-webview'
import useList from './useList'export default function Index(props) {const { uri, jsCode, webViewRef, handleMessage, handleLoad } = useList(props)return (<><WebViewref={webViewRef}source={{uri,}}style={{ flex: 1 }}injectedJavaScriptBeforeContentLoaded={jsCode} //injectedJavaScriptBeforeContentLoaded injectedJavaScriptoriginWhitelist={['*']}onMessage={(value) => handleMessage(value)}onLoad={() => handleLoad()}/></>)
}

RN useList.js:

import { useState, useEffect, useRef } from 'react'
import AsyncStorage from '@react-native-async-storage/async-storage'
import Constants from 'expo-constants'export default function useList() {let uri =Constants.manifest.extra.REACT_APP_MODE === 'dev'? `${Constants.manifest.extra.devHost}:3000/#/single/demo/test1`: 'https://chat.xutongbao.top/#/ai/chat'const webViewRef = useRef(null)const jsCode = `window.reactNative = {};window.reactNative.testData = 'inject data:1';true; // note: this is required, or you'll sometimes get silent failures
`const handleLoad = async () => {console.log('load')}const handleMessage = (value) => {let payload = value.nativeEvent?.data? JSON.parse(value.nativeEvent.data): {}let type = payload.typeif (type === 'getToken') {let fun = async () => {const token = await AsyncStorage.getItem('token')webViewRef.current.postMessage(JSON.stringify({type,token: token,}))}fun()webViewRef.current.postMessage(JSON.stringify({type: 'getBrowserInfo',}))} else if (type === 'getBrowserInfo') {console.log(payload)}}useEffect(() => {// eslint-disable-next-line}, [])return {uri,jsCode,webViewRef,handleMessage,handleLoad,}
}

网页 Index.js:

import React, { useState, useEffect } from 'react'
import uaParser from 'ua-parser-js'
import './index.css'export default function Index() {const [testData, setTestData] = useState()const [token, setToken] = useState()const handleGetDataFromInjected = () => {if (window.reactNative?.testData) {setTestData(window.reactNative?.testData)setToken(window.reactNative?.token)}}const handleGetToken = () => {window.ReactNativeWebView.postMessage(JSON.stringify({ type: 'getToken' }))}const handleMessage = () => {window.document.addEventListener('message', function (e) {let payload = e.data ? JSON.parse(e.data) : {}let type = payload.typeif (type === 'getToken') {setToken(payload.token)} else if (type === 'getBrowserInfo') {let ua = uaParser(navigator.userAgent)const { browser } = uawindow.ReactNativeWebView.postMessage(JSON.stringify({ type, browser }))}})}useEffect(() => {handleGetDataFromInjected()}, [])useEffect(() => {handleGetToken()}, [])useEffect(() => {handleMessage()}, [])return (<div className='m-test1'><div>{testData}</div><div>token:{token}</div></div>)
}

 

 

 

参考链接:

https://github.com/react-native-webview/react-native-webview/blob/eb2ce07e728352abe8b11d10a9de2a4fdc2f228b/docs/Guide.md#communicating-between-js-and-native

https://chat.xutongbao.top/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iPhone删除的照片能恢复吗?不小心误删了照片怎么找回?

iPhone最近删除清空了照片还能恢复吗&#xff1f;大家都知道&#xff0c;照片对于我们来说是承载着美好回忆的一种形式。它记录着我们的平淡生活&#xff0c;也留住了我们的美好瞬间&#xff0c;具有极其重要的纪念价值。 照片不小心误删是一件非常难受的事&#xff0c;那么iP…

android TextView 超出长度使用省略号

在Android中最常见的需求&#xff0c;就是在在外部展示信息时&#xff0c;需要简要展示内容。TextView仅需在静态布局文件中设置以下几个属性&#xff1a; android:maxWidth“100dp” // 宽度是多少才算超出 android:maxLines"2" // 高度多少才算超出 android:elli…

React下载文件的两种方式

React下载文件的两种方式 - 代码先锋网 不知道有用没用看着挺整齐 没试过 1、GET类型下载 download url > {const eleLink document.createElement(a);eleLink.style.display none;// eleLink.target "_blank"eleLink.href url;// eleLink.href record;d…

Centos7 配置Docker镜像加速器

docker实战(一):centos7 yum安装docker docker实战(二):基础命令篇 docker实战(三):docker网络模式(超详细) docker实战(四):docker架构原理 docker实战(五):docker镜像及仓库配置 docker实战(六):docker 网络及数据卷设置 docker实战(七):docker 性质及版本选择 认知升…

CentOS系统环境搭建(五)——Centos7安装maven

centos系统环境搭建专栏&#x1f517;点击跳转 Centos7安装maven 下载压缩包 maven下载官网 解压 压缩包放置到/usr/local tar -xvf apache-maven-3.9.2-bin.tar.gz配置环境变量 vim /etc/profile在最下面追加 MAVEN_HOME/usr/local/apache-maven-3.9.2 export PATH${MAV…

Jenkins 监控dist.zip文件内容发生变化 触发自动部署

为Jenkins添加plugin http://xx:xx/manage 创建一个任务 构建触发器 每3分钟扫描一次&#xff0c;发现指定文件build.zip文件的MD5发生变化后 触发任务

【C++学习手札】一文带你认识C++虚继承​​

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a;C虚函数&#xff08;很重要&#xff0c;内部剖析&#xff09; ♈️今日夜电波&#xff1a;僕らのつづき—柊優花 1:06 ━━━━━━️&#x1f49f;──────── 3:51 …

创建密码库/创建用户帐户/更新 Ansible 库的密钥/ 配置cron作业

目录 创建密码库 创建用户帐户 更新 Ansible 库的密钥 配置cron作业 创建密码库 按照下方所述&#xff0c;创建一个 Ansible 库来存储用户密码&#xff1a; 库名称为 /home/curtis/ansible/locker.yml 库中含有两个变量&#xff0c;名称如下&#xff1a; pw_developer&#…

神经网络基础-神经网络补充概念-39-梯度消失与梯度爆炸

简介 梯度消失和梯度爆炸是在深度神经网络中训练过程中可能出现的问题&#xff0c;导致模型难以训练或无法收敛。这些问题与反向传播算法中的梯度计算有关。 概念 梯度消失&#xff08;Gradient Vanishing&#xff09;&#xff1a;在深层神经网络中&#xff0c;特别是具有很…

File inclusion

文章目录 File inclusion(local)File inclusion(remote) File inclusion(local) 随便选择一个点击提交&#xff0c;提交后观察 url ?filename 我们可以使用相对路径../../../../../访问我们想要看到的文件内容 查看windows系统的主机映射文件../../../../Windows/System32/…

ShardingSphere 可观测 SQL 指标监控

ShardingSphere并不负责如何采集、存储以及展示应用性能监控的相关数据&#xff0c;而是将SQL解析与SQL执行这两块数据分片的最核心的相关信息发送至应用性能监控系统&#xff0c;并交由其处理。 换句话说&#xff0c;ShardingSphere仅负责产生具有价值的数据&#xff0c;并通过…

Go 语言中排序的 3 种方法

原文链接&#xff1a; Go 语言中排序的 3 种方法 在写代码过程中&#xff0c;排序是经常会遇到的需求&#xff0c;本文会介绍三种常用的方法。 废话不多说&#xff0c;下面正文开始。 使用标准库 根据场景直接使用标准库中的方法&#xff0c;比如&#xff1a; sort.Intsso…

【C++】AVL树(平衡二叉树)

目录 一、AVL树的定义二、AVL树的作用三、AVL树的插入操作插入——平衡因子的更新插入——左单旋插入——右单旋插入——左右双旋插入——右左双旋 四、ALVL树的验证五、AVL树的性能 一、AVL树的定义 AVL树&#xff0c;全称 平衡二叉搜索&#xff08;排序&#xff09;树。 二…

一次Linux图形化界面恢复

一次Linux 图形化界面恢复 一次Linux 图形化界面恢复出现问题场景问题排查 一次Linux 图形化界面恢复 出现问题场景 使用xmanager远程连接虚机的CentOS7系统图形界面出现已拒绝x11转移申请问题&#xff0c;在折腾X11过程中&#xff0c;安装与卸载的过程中不小心把xorg-x11-xa…

HCIP的交换机实验

题目 拓扑图 PC1/3接口用access 创建WLAN LSW1 创建WLAN [lsw1]vlan batch 2 to 6[lsw1-Ethernet0/0/1]p [lsw1-Ethernet0/0/1]port l [lsw1-Ethernet0/0/1]port link- [lsw1-Ethernet0/0/1]port link-flap [lsw1-Ethernet0/0/1]port link-type acc [lsw1-Ethernet0/0…

kubeasz在线安装K8S集群单master集群(kubeasz安装之二)

一、介绍 Kubeasz 是一个基于 Ansible 自动化工具&#xff0c;用于快速部署和管理 Kubernetes 集群的工具。它支持快速部署高可用的 Kubernetes 集群&#xff0c;支持容器化部署&#xff0c;可以方便地扩展集群规模&#xff0c;支持多租户&#xff0c;提供了强大的监控和日志分…

Bigemap Pro国产基础软件介绍——一款多源数据处理软件

一、软件简介 Bigemap Pro是由成都比格图数据处理有限公司(下称”BIGEMAP”)开发和发行的国产大数据处理基础软件。Bigemap Pro是在BIGEMAP GIS Office基础上&#xff0c;经过十年的用户积累与反馈和技术更新迭代出的新一代基础软件产品。Bigemap Pro国产基础软件集成了数据采…

【Diffusion】李宏毅2023机器学习Diffusion笔记

文章目录 1 想法概述2 实际过程阶段1 Add Noise阶段2 Denoise 3 数学原理4 为什么推理时要额外加入noise5 一些不知道对不对的Summary 1 想法概述 从一张充满噪声的图中不断denoise&#xff0c;最终得到一张clear的图片。为了确定当前图片中噪声占比的大小&#xff0c;同时输入…

rust踩雷笔记(1)——切片传参和解引用赋值

最近学习rust&#xff0c;网上资料还是很有限&#xff0c;做题遇到的问题&#xff0c;有时需要自己试验。把自己做题过程遇到的问题&#xff0c;和试验的结论&#xff0c;做一些简单记录。 阅读下列文字和代码 用切片&#xff08;的引用&#xff09;做参数要非常小心&#xff…

LVS负载均衡之--Keepalived模式(超详细)

一.Keepalived概述 Keepalived起初是专门针对LVS设计的一款强大的辅助工具&#xff0c;主要用来提供故障切换和健康检查功能-----判断LVS负载调度器&#xff0c;节点服务器的可用性&#xff0c;及时隔离并替换为新的服务器&#xff0c;当故障主机恢复后将其重新加入群集中Keep…