使用iframe嵌套vue项目,并进行通信

近期项目需要,甲项目需要嵌套我们项目(乙项目)的一个页面。被嵌套页面不显示侧边菜单、不显示水平菜单,并且在进行相关操作后,乙项目向甲项目发送消息,话不多说,直接上代码:


1、甲项目(父页面)

<template>
	<iframe
		width="1400"
        height="600"
        id="egoist"
        :src="iframeUrl"
        trameborder="0"
        ref="iframe"
        >
     </iframe>
</template>

<script>
export default {
	data() {
		return {
			iframeUrl: '' // 这里是乙项目页面地址,可能会根据测试、预生产、生产环境变化
		}
	},
	mounted() {
    	window.addEventListener('message', function(e) {
      		// console.log('父页面接收子页面内容', e.data)
      		// 接收到子页面消息,进行相关操作
    	}, false)
  	},
	created() {
		this.getIframe()
	},
	methods: {
		getIframe() {
      		// 1、 这里是直接将去到子页面需要用到的token,携带直接跳到目标页面,在目标页面进行登录后,去到目标页面
            let iframeToken= await this.$user.getToken()
            this.iframeUrl = 'https://hhhh.net/test/mine' + '?iframeToken=hhhhh'
            // 2、 这里将token以消息方式传递给子页面
            // let param = {
            //   token
            // }
          	// this.$refs.iframe.contentWindow.postMessage(param,'*')}
 	}
}
</script>

2、乙项目(子页面,被嵌套的页面)
(1)在项目中路由守卫,进行登录处理的地方,处理携带iframeToken的登录以及跳转

router.beforeEach(async(to, from, next) => {
	NProgress.start()
	if (有token) {
		// 登录了的相关处理
		// 获取用户信息之类
	} else {
		const query = to.query
      	const path = to.path
      	// 如果是嵌入页面携带token
		if (query.iframeToken) {
			const ssoToken = query.iframeToken
        	store.dispatch('SSOLogin', ssoToken).then(() => {
          		next({ path: to.path })
        	}).catch(() => {
        	// sso登录失败的处理
          	//const { jti, exp } = JSON.parse(window.atob(ssoToken.split('.')[1]))
          	// axios.post(window.location.protocol + '//' + process.env.SSO_LOGOUT_URL, {
            // 		jti,
            // 		exp
          	// }).finally(() => {
          })
        })
      }
	}
})

(2)状态管理中判断,页面是否以嵌套形式出现,这里是放在store/modules/app.js下:

state: {
    // 是否以系统内嵌的方式呈现
    isIframe: !(window.top === window.self)
}

(3)、 页面中进行数据传递(此路径下的页面/test/mine)

<template>
	<button v-if="isIframe" @click="sendMes">点击发送消息</button>
	// 也可以使用isIframe控制侧边菜单、水平菜单
</template>

<script>
export default {
	data() {
		return {}
	},
	mounted() {
    	window.addEventListener('message', function(e) {
      		// console.log('接收父页面内容', e.data)
    	}, false)
  	},
  	computed: {
		isIframe() {
        	return this.$store.state.app.isIframe
      	}
	},
	created() {},
	methods: {
		sendMes() {
      		if (this.isIframe) {
      			window.parent.postMessage({
					data: {
						id: order.orderId,
						tag: order.status
					}
				}, '*')
			}
 	}
}
</script>

以上是在项目中的相关处理,有待完善。。。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值