uniapp web-view组件数据传递及使用注意点示例详解

 更新时间:2025年06月03日 10:30:55   作者:web前端-rx  
uni-app中的web-view是一个 web 浏览器组件,可以用来承载网页的容器,这篇文章主要介绍了uniapp web-view组件数据传递及使用注意点的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1.vue页面

本篇文章除特别指出,H5均指原生html文档,非uniapp编译的h5

vue页面向html页面传参数:①直接在src后面拼接参数(除App端之外,其他端除该方法外无其它办法)②使用evalJs执行h5里某个函数(仅App支持)

<web-view :src="src"></web-view>
let src = ref('')
src.value = `/hybrid/html/xx.html?a1=${a1}&a2=${a2}`

H5接收:

//通用(建议原生Html使用):    

function getQueryVariable(variable) {
        var query = decodeURIComponent(window.location.search.substring(1));
        var vars = query.split("&");
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split("=");
            if (pair[0] == variable) { return pair[1]; }
        }
        return '';
    }

    const a1 = getQueryVariable('a1');



//如果是uniapp编译的h5可以推荐onLoad:

onLoad(e=>{
    console.log(e)
})

/*********************************************************************************************************/

H5向vue传递数据,实测注意H5中调用uni.navigateTo跳转uniapp页面时,不支持events参数!

// h5向打开该h5的页面传递参数:

        let obj = {};

        let envObj = {};
        uni.getEnv(function (res) {
            envObj = res
        });
        if (envObj.h5) {
            window.parent.postMessage(obj, "*");
        } else {
            uni.postMessage({
                data: obj
            });
        }

        uni.navigateBack()


// h5跳转其他页面传递参数:还是通过url传递

        uni.navigateTo({
            url: `/pages/p1/p1?param=${param}`
        })

        uni.redirectTo({
            url: `/pages/p1/p1?param=${param}`
        })

//其他uni跳转等等.....

vue接收h5传的参数

//在打开h5的页面接收参数

let data = {};

	// #ifdef H5
	function receiveMessage(event) {
        console.log(event) //按打印的实际数据,有些data是在event.data.data.arg里...
		if (event.data.type !== 'WEB_INVOKE_APPSERVICE') {
			data = event.data
		}
	}
	window.addEventListener("message", receiveMessage, false);
	// #endif

    // #ifndef H5
	const getMessage = (event) => {
        console.log(event) 
		if (Array.isArray(event.detail.data)) {
			data = event.detail.data[0];
		} else {
			data = event.detail.data;
		}
	}
    // #endif


//h5跳转的其他页面接收参数
import {onLoad} from '@dcloudio/uni-app'
onLoad(e=>{
    console.log(e)
}
	

vue向上一级vue页面传递数据:

//上一级vue页面:
        let url = 'xxxxxxx';
		uni.navigateTo({
			url: url,
			events: {
				// 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
				xxData: function(data) {
                    console.log(data);
                    console.log(data.xxDataObj)
                    //.........
				}
			}
		});

//打开h5的vue页面:
	import {
		getCurrentInstance,
	} from 'vue';

	import {
		onUnload
	} from '@dcloudio/uni-app'

    let data = '测试';
	const instance = getCurrentInstance().proxy
	const eventChannel = instance.getOpenerEventChannel()
	onUnload(() => {
		eventChannel.emit('xxData', {
			xxDataObj: data
		})
	})

2.nvue页面

//nvue页面需要设置style="flex: 1;"才能铺满全屏	

<web-view ref="myWebview" @onPostMessage="handlePostMessage" :src="src"
		style="flex: 1;"></web-view>

nvue向h5页面传数据仍可通过参数传递,也可以通过evalJs执行js语句:

const myWebview = ref('');  //注意不要初始声明为null,会报错

//并且可以操作h5里的全局变量
//evalJs应延迟执行或在handlePostMessage里执行
myWebview.value.evalJs("console.log('执行了')");

//或者
myWebview.value.evalJs("uniMsg(JSON.stringfiy(obj))");

h5向nvue传递数据非常简单,与vue一致,但不用返回或跳转,可实时传递:

            uni.postMessage({
                data: {
                    "xxx":"xxx"
                }
            })


//nvue页面接收:
	const handlePostMessage = e => {
        console.log(e)
		console.log(e.detail.data[0])
    }

特别注意:

1.App-安卓,如果项目配置了“自定义404等错误页面”,断网访问web-view组件vue页面,无法使用系统返回键返回,原生导航栏上返回也不行,只能杀死app重新进,控制台仅报红色“error”字母;官方也没有回复解决办法~,如果苹果也有类似问题欢迎讨论~(最新版HbuiderX4.57似乎已基本解决该问题,即多次按返回可以返回)

2.“UniAppJSBridgeReady”事件有时候会监听失败,原因未知,这个事件监听放在引入uni_webview.js的后面实测OK:

<script type="text/javascript" src="js/uni_webview.js"></script>
<script>
    document.addEventListener('UniAppJSBridgeReady', xxFn)
</script>

3.nvue页面中的h5页面实测无法支持暗黑模式即

@media (prefers-color-scheme: dark) {
    
}

即使nvue页面配置了plus.nativeUI.setUIStyle('auto');

4.nvue无法通过ref获取webview实例,不能动态设置webview或获取webview的一些参数;

通过plus创建的webview虽然可以获得实例,但需要自己设置宽高,无法做到向flex:1一样铺满屏幕;通过计算得到的高度可能会有适配问题。

通过AI了解到nvue比vue页面加载webview并不会有性能优化。

所以个人推荐除非有无法解决的实时通信需求可以用nvue(比如App加载的webview里有下载按钮,希望下载时停留在h5页面而不是回退或跳转),其他情况都用vue页面

5.$getAppWebview() 不是官方公开 API,它是 HBuilderX 内部方法,仅在 App 平台有效。

其他平台(如 H5、小程序)不支持该方法,调用会报错。

总结

到此这篇关于uniapp web-view组件数据传递及使用注意点的文章就介绍到这了,更多相关uniapp web-view组件数据传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Bootstrap基本组件学习笔记之进度条(15)

    Bootstrap基本组件学习笔记之进度条(15)

    这篇文章主要为大家详细介绍了Bootstrap基本组件学习笔记之进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaScript展开运算符和剩余运算符的区别详解

    JavaScript展开运算符和剩余运算符的区别详解

    本文主要介绍了JavaScript展开运算符和剩余运算符的区别详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • date.parse在IE和FF中的区别

    date.parse在IE和FF中的区别

    这个方法是很常用的,比如在验证输入日期是否存在时,可以使用它,如果是一个不存在的日期,则其返回值将是NaN,另外如果要比较两个日期的先后,或是计算两个日期相差的天数 ,都可以用到。
    2010-07-07
  • 一文带你深入了解JavaScript中的闭包

    一文带你深入了解JavaScript中的闭包

    闭包(closure)是一个函数以及其捆绑的周边环境状态的引用的组合,就是让开发者可以从内部函数访问外部函数的作用域,下面下面小编就来和大家深入聊聊它的使用吧
    2023-07-07
  • uniapp使用Vant-weapp的最新方法教程

    uniapp使用Vant-weapp的最新方法教程

    Vant Weapp是有赞前端团队开源的一套小程序UI组件库,助力开发者快速搭建小程序应用,下面这篇文章主要给大家介绍了关于uniapp使用Vant-weapp的最新方法教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • js 3种归并操作的实例代码

    js 3种归并操作的实例代码

    这篇文章介绍了js 3种归并操作的实例代码,有需要的朋友可以参考一下
    2013-10-10
  • javascript 数组排序函数

    javascript 数组排序函数

    javascript的数组排序函数 sort方法,默认是按照ASCII 字符顺序进行升序排列。
    2009-08-08
  • JavaScript快速排序

    JavaScript快速排序

    JavaScript快速排序...
    2007-01-01
  • JavaScript数据可视化:ECharts制作地图

    JavaScript数据可视化:ECharts制作地图

    这篇文章主要介绍了Echarts实现可视化地图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • 如何用js实现判断是否是小数

    如何用js实现判断是否是小数

    这篇文章主要给大家介绍了关于如何用js实现判断是否是小数的相关资料,文中介绍了如何通过使用isNaN()函数和使用正则表达式来解决,具有一定参考借鉴价值,需要的朋友可以参考下
    2024-04-04

最新评论