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

20 回复

你的意思是在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实现的,它只能替换当前页面记录,无法清除之前的页面历史。这是浏览器安全机制限制导致的。

目前可行的解决方案有:

  1. 对于需要清空页面栈的场景,可以使用uni.redirectTo替代reLaunch,虽然不能完全清空栈,但可以避免页面叠加

  2. 在H5平台特殊处理,使用window.location.href进行完全跳转(会刷新页面):

if(process.env.VUE_APP_PLATFORM === 'h5') {
  window.location.href = '/pages/c/c'
} else {
  uni.reLaunch({url: '/pages/c/c'})
}
  1. 或者使用uni.navigateBack结合getCurrentPages()手动清栈:
const pages = getCurrentPages()
uni.redirectTo({url: '/pages/c/c'})
setTimeout(() => {
  uni.navigateBack({delta: pages.length})
}, 300)
回到顶部