uni-app navigateBack浏览器返回原本页面网页路径不变问题

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app navigateBack浏览器返回原本页面网页路径不变问题

### 开发环境信息

| 信息           | 值          |
|----------------|-------------|
| 产品分类       | uniapp/H5   |
| PC开发环境操作系统 | Windows     |
| PC开发环境操作系统版本号 | 10          |
| HBuilderX类型  | 正式        |
| HBuilderX版本号 | 4.27        |
| 浏览器平台     | 微信内置浏览器 |
| 项目创建方式   | HBuilderX   |

### 操作步骤
从A页面使用navigateTo跳转到B页面,再从B页面使用navigateBack返回  
页面路径的变化是xxx.com/A >> xxx.com/B 使用navigateBack后 页面回到了A页面但是网页路径还是 xxx.com/B,这时候在右上角选择浏览器打开就会打开 xxx.com/B页面  

### 预期结果
从A页面使用navigateTo跳转到B页面,再从B页面使用navigateBack返回  
页面路径的变化是xxx.com/A >> xxx.com/B 使用navigateBack后 页面回到了A页面但是网页路径还是 xxx.com/B,这时候在右上角选择浏览器打开就会打开 xxx.com/B页面  

### 实际结果
从A页面使用navigateTo跳转到B页面,再从B页面使用navigateBack返回  
页面路径的变化是xxx.com/A >> xxx.com/B 使用navigateBack后 页面回到了A页面但是网页路径还是 xxx.com/B,这时候在右上角选择浏览器打开就会打开 xxx.com/B页面  

### bug描述
从A页面使用navigateTo跳转到B页面,再从B页面使用navigateBack返回  
页面路径的变化是xxx.com/A >> xxx.com/B 使用navigateBack后 页面回到了A页面但是网页路径还是 xxx.com/B,这时候在右上角选择浏览器打开就会打开 xxx.com/B页面  

2 回复

我刚用你的办法试了下,没发现你说的问题。下面是两个界面,然后附件是视频 jump界面
<template>
<view>
<button @click=“eeee”>222222222222</button>
</view>
</template>

<script> export default { methods: { eeee(){ uni.navigateTo({ url:'/pages/index/c' }) } } } </script> <style> </style>

c界面
<template>
<view>
<button @click=“eeee”>33333333333333</button>
</view>
</template>

<script> export default { methods: { eeee(){ uni.navigateBack() } } } </script> <style> </style>

在uni-app中,navigateBack 方法主要用于页面导航回退,它通常在小程序或App环境中表现良好,因为这些环境原生支持页面栈的概念。然而,在浏览器环境中,由于页面栈机制的不同,navigateBack 方法可能不会改变URL地址,这会导致一些问题,比如用户刷新页面后无法回到正确的状态。

为了解决这个问题,我们可以采取一些策略来模拟页面回退并更新URL。以下是一个基于Vue和uni-app的解决方案,它结合了编程式导航和手动更新URL的方式。

解决方案

  1. 使用Vue Router(仅适用于H5平台)

    在H5平台上,你可以考虑使用Vue Router来管理路由,而不是完全依赖uni-app的页面导航方法。这样,你可以利用Vue Router提供的back()方法来模拟回退,并确保URL正确更新。

    // 假设你已经安装并配置了Vue Router
    import router from './router'; // 引入你的路由配置
    
    methods: {
      goBack() {
        if (this.$route.meta.from) { // 假设你在路由元信息中保存了来源路由
          router.replace(this.$route.meta.from);
        } else {
          router.back(); // 如果没有来源信息,尝试浏览器默认回退
        }
      }
    }
    

    在路由配置中,你可能需要添加一些逻辑来保存来源路由信息:

    const routes = [
      {
        path: '/some-page',
        component: SomePage,
        beforeEnter(to, from, next) {
          to.meta.from = from.fullPath; // 保存来源路由
          next();
        }
      },
      // 其他路由配置...
    ];
    
    const router = new VueRouter({
      routes
    });
    
  2. 手动管理历史记录

    如果你不想引入Vue Router,或者你的项目有特殊需求,你也可以手动管理浏览器的历史记录。使用history.back()可以模拟浏览器的回退按钮,但它不会给你太多控制权。更灵活的方式是使用history.pushStatehistory.replaceState结合popstate事件来管理历史记录和URL。

    这种方法比较复杂,通常涉及到全局状态管理和复杂的路由逻辑,因此在这里不展开具体代码。不过,核心思想是通过监听路由变化来更新应用状态,并在必要时手动调整URL。

总之,对于uni-app在H5平台上的navigateBack问题,最佳实践通常是结合Vue Router或手动管理历史记录来确保URL的正确性。这不仅可以解决回退时URL不变的问题,还可以提高应用的可维护性和用户体验。

回到顶部