uni-app vue3 项目中A页面使用window.open打开外部链接B,当B返回时会导致整个应用刷新
uni-app vue3 项目中A页面使用window.open打开外部链接B,当B返回时会导致整个应用刷新
操作步骤:
- 使用cli方式创建一个uni-app项目,编写一个分页列表
- 点击列表使用window.open 打开一个外部链接
- 关闭(返回)外部链接,整个应用会重新刷新,导致列表页面浏览位置丢失
预期结果:
- 返回时应停留在用户上一次浏览的位置
实际结果:
- 整个应用会重新刷新,导致列表页面浏览位置丢失
bug描述:
uni-app vue3 项目中A页面 使用window.open打开外部链接B,当B返回时会导致整个应用刷新。
我有一个分页列表界面A,A中点击某一项使用window.opne 打开外部链接B,当B页面返回时A会自动刷新,导致用户浏览位置丢失,我之前使用Vue2 开发的项目同样的场景下,B页面返回A页面时是可以记录浏览位置的。
补充一下,由于外部链接限制 无法使用webview
你好,这个应该和微信浏览器的webview加载策略有关。 你尝试一下vue2版的uniapp是不是也是这种效果,如果vue2同样效果应该就是微信浏览器的webview的设置原因
我也遇到这个问题了,有解决办法吗
在uni-app中,使用window.open
打开外部链接通常会导致新页面在浏览器或WebView中打开,而不是在应用中内嵌的WebView中。因此,当从外部链接B返回时,整个应用可能会因为页面导航的外部性而刷新。为了解决这个问题,我们可以尝试以下几种方法,但请注意,这些方法可能需要根据实际情况进行调整。
方法一:使用uni-app的plus.webview
如果你是在App环境中(如使用HBuilderX打包的App),可以利用plus.webview
来管理外部链接的打开与关闭,从而避免整个应用的刷新。
// A页面代码
methods: {
openExternalLink() {
const url = 'https://example.com/B';
const webview = plus.webview.create(url, 'webview_external', {
top: '0px',
bottom: '0px'
});
webview.show();
// 监听关闭事件
plus.webview.currentWebview().addEventListener('close', () => {
// 在这里处理关闭逻辑,比如关闭webview或刷新A页面
webview.close();
// 如果不希望A页面刷新,可以不做任何操作
});
}
}
方法二:使用uni-app的<web-view>
组件
在App和H5环境中,你可以使用<web-view>
组件来嵌入外部链接,这样可以通过控制组件的显示与隐藏来避免应用刷新。
<!-- A页面代码 -->
<template>
<view>
<button @click="openWebview">打开外部链接B</button>
<web-view v-if="showWebview" :src="webviewSrc"></web-view>
</view>
</template>
<script>
export default {
data() {
return {
showWebview: false,
webviewSrc: 'https://example.com/B'
};
},
methods: {
openWebview() {
this.showWebview = true;
},
closeWebview() {
this.showWebview = false;
// 可以在这里处理其他逻辑,比如清除缓存等
}
}
};
</script>
<!-- 注意:这里没有直接监听<web-view>的关闭事件,因为<web-view>不支持该事件。
你可能需要通过其他方式(如URL参数、postMessage等)来通知A页面关闭<web-view>。 -->
在实际应用中,你可能需要根据具体需求选择适合的方法,并可能需要对代码进行进一步的调整和优化。特别是在处理外部链接与应用的交互时,需要特别注意跨域通信和数据安全的问题。