uni-app中reLaunch跳转在h5平台上不能清空之前的页面栈?
uni-app中reLaunch跳转在h5平台上不能清空之前的页面栈?
详细问题描述
[内容]:reLaunch跳转在h5中不能清空页面栈?
重现步骤
[步骤]
h5项目在页面中使用reLaunch进行跳转页面
a(navigateTo)->b(reLaunch)->c
[结果] c页面可以返回,直接返回到a页面,没有达到在小程序中应有的清空页面栈效果,相当于只是把b页面重定向了到了c
[期望] 可以清空之前页面栈,进行跳转
IDE运行环境说明
[HBuilder 或 HBuilderX。如果你用其他工具开发uni-app,也需要在此说明] :vscode
uni-app运行环境说明
[运行端是h5或app或某个小程序?]:h5
[项目是cli创建的还是HBuilderX创建的?如果是cli创建的,请更新到最新版cli再试]:cli
[编译模式是老模板模式还是新的自定义组件模式?]:新
更多关于uni-app中reLaunch跳转在h5平台上不能清空之前的页面栈?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你的意思是在c页面relaunch到c是吗?H5端没法这么操作
更多关于uni-app中reLaunch跳转在h5平台上不能清空之前的页面栈?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
不好意思 刚才上面b步骤打错了 应该是 a(navigateTo)->b(reLaunch)->c 按照在小程序上的逻辑c如果返回的话就只能关闭项目了,因为没有页面栈了,reLaunch跳转时将页面栈清空了。
在h5上面c页面还能返回到a页面…
无法完整控制浏览器的后退功能,js无法清理所有浏览历史,h5中暂不支持该功能
uni.reLaunch在h5里不能实现清空历史栈的功能?
回复 喧尘: 嗯
回复 DCloud_UNI_GSQ: 咱们uniapp文档上 没有tip出来呀
回复 喧尘: 好的,已增加Tips:
H5端调用之后虽然之前页面栈会销毁,但是无法清空浏览器之前的历史记录,此时navigateBack不能返回,但如果存在历史记录的话点击浏览器的返回按钮或者调用history.back()仍然可以导航到浏览器的其他历史记录。
回复 DCloud_UNI_GSQ: 现在看到的效果 a(navigateTo)->b(reLaunch)->c c操作返回 直接返回到a,相当与reLaunch和redirectTo一样将b页面重定向为了c么?
回复 喧尘: 不一样,如果是redirectTo,a仍然存活。
回复 DCloud_UNI_GSQ: 您的意思是reLaunch方法跳转,虽然用浏览器的返回还可以返回到之前的记录,但其实框架已经把之前的页面栈实例给删了?redirectTo框架只删除了当前页面的实例?
你好 方便加您个微信沟通一下么? 我的微信是18101211619 您如果方便的话加我一下吧 感谢!
回复 喧尘: 是的
请问这个问题最终如何解决的呢
同问 这个能解决么 或者监听到返回然后拦截了
同问,请问怎么解决
同问,有解决方案了吗?
在uni-app中,reLaunch方法在H5平台确实存在页面栈不能完全清空的问题。这是因为H5平台的导航机制与原生小程序不同,H5使用的是浏览器历史记录栈,而小程序使用的是原生页面栈管理。
对于H5平台,reLaunch实际上是通过location.replace实现的,它只能替换当前页面记录,无法清除之前的页面历史。这是浏览器安全机制限制导致的。
目前可行的解决方案有:
-
对于需要清空页面栈的场景,可以使用uni.redirectTo替代reLaunch,虽然不能完全清空栈,但可以避免页面叠加
-
在H5平台特殊处理,使用window.location.href进行完全跳转(会刷新页面):
if(process.env.VUE_APP_PLATFORM === 'h5') {
window.location.href = '/pages/c/c'
} else {
uni.reLaunch({url: '/pages/c/c'})
}
- 或者使用uni.navigateBack结合getCurrentPages()手动清栈:
const pages = getCurrentPages()
uni.redirectTo({url: '/pages/c/c'})
setTimeout(() => {
uni.navigateBack({delta: pages.length})
}, 300)