uni-app H5使用web-view父子之间的相互传值

遇到的问题:

  • uni-app 使用uParse组件无法将富文本页面的样式显示完整,比如图片大小的问题,部分复杂样式无法显示,所以使用web-view 组件来展示富文本数据

uni-app页面代码

<template>
	<view class="container_box">
		<web-view  ref='webView' :src="viewUrl" ></web-view>
	</view>
</template>

<script>
	import {
		articelInfo
	} from "@/api/homepage"
	export default {
		data() {
			return {
				viewUrl: "/hybrid/html/index.html",
			}
		},
		onLoad(option) {
				console.log('route', this.$route)
				if (option.id) {
					this.id = option.id
					//简单的传值 可以放在链接上
					this.viewUrl="/hybrid/html/index.html?id="+this.id; 
				}
					this.get_articelInfo()

		},
		mounted() {
		//父组件接收子组件的内容
			// #ifdef H5 
			 let _this = this;
			    window.addEventListener('message', event=> {
					console.log("父页面:",event);
			        if(event.data.even=='previewFile') {
						_this.previewFile(event.data);
			        }
			    },false)
			// #endif 
		},
		destroyed() {
			uni.removeStorageSync("articelInfo");
		},
		methods: {
			get_articelInfo() {
				//省略数据查询。。。。
						const articelInfo={
							even:'articelInfo',
							id:id,
							updateUser:updateUser,
							title : title ,
							createTime : createTime,
							enclosure:enclosure,
							author : author,
							visits :"阅读" + " " + visits,
							publishTime: parseTime(publishTime, "{y}-{m}-{d}"),
							updateTime : updateTime,
							updateUserName : updateUserName,
							createUser : createUser,
							content:content.replace(reg, 'video').replace(/< img [^>]*/gi, (match, capture) => {
							return `< img style="max-width: 100%" />`
						}),
						}
						//查到数据之后,将数据传到子组件
						window.frames[0].postMessage(articelInfo,"*")
					}
				})
			},
		}
	}
</script>

web-view(HTML页面),子组件接收父组件数据,子组件传值给父组件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<title>{{articelInfo.title}}</title>
		<script src="./js/vue@2.js"></script>
	</head>
	<body>
		<div id="view-vue" class="container_div content" v-if="articelInfo.id != null">
			省略内容
			<div v-html="articelInfo.content"></div>
		</div>
		<script>
			new Vue({
				el: '#view-vue',
				data: function() {
					return {
						articelInfo: {
							id: null
						},
					}
				},
				mounted() {
					//子组件监听父组件传过来的数据
					window.addEventListener('message', (event) => {
						console.log("子组件收到消息:", event)
						if (event.data.even == 'articelInfo') {
							this.$nextTick(function() {
								this.$set(this, 'articelInfo', event.data);
							})
						}
					}, false);
				},
				methods: {
				//点击事件向父组件传值
					clickFile(item) {
						item.even = "previewFile";
						if (window.parent) {
							window.parent.postMessage(item, '*');
						}
					},
				}
			})
		</script>
	</body>
</html>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值