[uni-app] web-view 子传父,父传子,子父(父子)之间的相互传值(相互通信)

一、演示及项目地址

🎉🎉🔥基于vue3.x 、Typescript、vite、Element plus等,适配手机、平板、pc 的后台开源免费模板库(vue2.x请切换vue-prev-admin分支)

子项目地址(子界面(vite项目)):https://gitee.com/lyt-top/uni-app-web-view/tree/master/%E5%AD%90%E7%95%8C%E9%9D%A2%EF%BC%88vite%E9%A1%B9%E7%9B%AE%EF%BC%89

父项目地址(父界面(uni-app项目)):https://gitee.com/lyt-top/uni-app-web-view/tree/master/%E7%88%B6%E7%95%8C%E9%9D%A2%EF%BC%88uni-app%E9%A1%B9%E7%9B%AE%EF%BC%89

二、子传父

2.1 需要注意事项

需真机运行(数据线链接),HBuilder X 中

在这里插入图片描述

  1. 子界面需引入 uni.webview.1.5.2.js
  2. 父界面:使用 @message
  3. 子界面:使用 uni.postMessage(传值需放入 data 中)
2.2 使用教程
2.2.1 子界面(vite项目)(发送)

main.js 中引入,uni.webview.1.5.2.js 点击跳转查看

import "/uni.webview.1.5.2.js";

components/HelloWorld.vue 下使用 uni.webView.postMessage,需要注意:要传送的数据放 data

<template>
  <button @click="onSend">网页向uni-app传值</button>
</template>

<script>
export default {
  methods: {
    onSend() {
      uni.webView.postMessage({
        data: {
          name: "lyt",
          age: 18,
        },
      });
    },
  },
};
</script>
2.2.2 父界面(uni-app项目)(接收)

pages/index/index.vue 下,通过 @message 接收。url 地址为 子界面(vite项目) cnpm run dev 跑起来后的项目地址(建议使用 ip 地址访问

<web-view :src="url" @message="handleMessage"></web-view>

methods 中写 handleMessage 方法

methods: {
	handleMessage(res) {
		console.log(JSON.stringify(res))
		const {
			name,
			age
		} = res.detail.data[0]
		uni.showModal({
			title: '获取子级传的值',
			content: `获取到的值为:name:${name},age:${age}`,
			showCancel: false,
			confirmText: '关闭弹出',
			success() {}
		})
	},
}
2.2.3 效果图

HBuilder X 中 打印的值:

在这里插入图片描述
真机效果图:

在这里插入图片描述

三、父传子

3.1 需要注意事项
  1. 父界面:先获取当前 web-view(this.$scope.$getAppWebview().children()[0]),通过 evalJS("xxx({msg: '雷猴啊'})")
  2. 子界面:window.xxx = (res) => {}
3.2 使用教程
3.2.1 子界面(vite项目)(接收)

sendParentData 为父界面(uni-app项目)中 evalJS 方法定义的方法名 (可随便自定义)

<template>
  <div>xxx</div>
</template>

<script>
export default {
  created() {
    window.sendParentData = (res) => {
      console.log(JSON.stringify(res));
      window.alert(JSON.stringify(res));
    };
  },
};
</script>
3.2.2 父界面(uni-app项目)(发送)

通过 evalJS 方法传送方法及数据

<template>
	<view class="content">
		<button style="position: relative;z-index: 2;" @click="onSend">父传子</button>
		<web-view :src="url" @message="xxx"></web-view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				url: 'http://192.168.1.103:3000/'
			}
		},
		onShow: function() {},
		methods: {
			onSend() {
				// #ifdef APP-PLUS
				const vw = this.$scope.$getAppWebview().children()[0]
				vw.evalJS("sendParentData({msg: '雷猴啊'})")
				// #endif
			}
		}
	}
</script>
3.2.3 效果图

HBuilder X 中 打印的值:

在这里插入图片描述
真机效果图:

在这里插入图片描述

四、总结

  1. 父传子:父:通过 evalJS('xxx'),子:通过 window.xxx 回调
  2. 子传父:子:通过 uni.webView.postMessage({data: {xxx}}),父:通过 @message 接收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值