【问题标题】:How can I go back/route-back on vue-router?如何在 vue-router 上返回/路由返回?
【发布时间】:2018-06-14 17:58:22
【问题描述】:

好的,简单解释一下:

我有 3x 页。

  • 第 1 页(首页)
  • 第 2 页(菜单)
  • 第 3 页(关于)

第 1 页有一个-

<router-link to="/menu">

单击时路由到“/menu”的按钮。

目前,第 2 页(菜单)有一个

<router-link to="/">

按钮,当单击此按钮时,它会恢复到上一个​​位置“/”第 1 页(主页)。

但我不想为每个页面创建一个路由组件以“返回”到前一页(好像我有 100 个页面,这可能是很多工作路由返回)。有没有办法用 vue-router 做到这一点?类似于window.history.back()

想知道是否有办法做到这一点,因为我在文档中找不到它。

提前致谢!约翰

【问题讨论】:

  • @yuriy636's 可能是最好的答案。目前我们有一个带有后退按钮的外部组件,它使用当前 url 上的字符串操作返回到路由中的最后一页。当我们现在有机会时,我们可能会更改为 router.go 方法
  • 好的,谢谢!它正盯着我的脸!不过,我不确定如何将其写入我的语法中。对不起!我是新手!

标签: javascript webpack vue.js vuejs2 vue-router


【解决方案1】:

您可以使用Programmatic Navigation。为了返回,你使用这个:

router.go(n) 

n 可以是正数或负数(返回)。这与history.back() 相同。因此您可以拥有这样的元素:

<a @click="$router.go(-1)">back</a>

【讨论】:

  • 有人在 IE11 上遇到过这个问题吗?例如,如果我通过路由器链接打开一个页面,单击我的按钮它会返回,但是如果我通过路由器链接打开同一页面,router.go(-1) 会清除我的 URL,但没有任何反应。
  • 如果加载时没有 id,我想返回上一页,它可以工作,但在页面刷新时 .go(-1) 会返回 2 页而不是 1 页。
  • 菜鸟问题,我们可以在这里使用a标签而不是router-link
  • @Hego555 我相信router-link是一个默认渲染a标签的组件
  • 这似乎忽略了您要返回的上一个 url 中的任何 url 参数
【解决方案2】:

直接使用$router.back() 在 vue-router 上以编程方式返回/路由返回。或者如果在组件的模板中使用router.back()

【讨论】:

  • 它是$router.back()
  • @aspirinemaga 如果您在组件的模板中使用它,则不是,如果是这种情况,您将其传递为 to="router.back()"
【解决方案3】:

这对我来说就像一个时钟:

methods: {
 hasHistory () { return window.history.length > 2 }
}

然后,在模板中:

<button 
  type="button"    
  @click="hasHistory() 
    ? $router.go(-1) 
    : $router.push('/')" class="my-5 btn btn-outline-success">&laquo; 
  Back
</button>

【讨论】:

  • 如果您来自应用程序外部的其他网站,您认为可以返回应用程序的上一页,但实际上您会将其留给外部网站。
【解决方案4】:

如果您使用的是Vuex,则可以使用https://github.com/vuejs/vuex-router-sync

只需在你的主文件中初始化它:

import VuexRouterSync from 'vuex-router-sync';
VuexRouterSync.sync(store, router);

每次路由更改都会更新Vuex 中的route 状态对象。 接下来您可以创建getter 以在路由状态下使用from 对象,或者只使用state(最好使用getter,但这是另一回事 https://vuex.vuejs.org/en/getters.html), 所以简而言之就是(内部组件方法/值):

this.$store.state.route.from.fullPath

你也可以直接放在&lt;router-link&gt;组件中:

<router-link :to="{ path: $store.state.route.from.fullPath }"> 
  Back 
</router-link>

因此,当您使用上面的代码时,将动态生成指向先前路径的链接。

【讨论】:

  • 这会导致无限循环问题
  • @TonyGW 不,它没有。
【解决方案5】:

如果您正在编写移动应用程序,这个问题的答案会变得更加棘手,因为您现在需要一个集成的解决方案,该解决方案可以容纳来自您的 UI 后退按钮或移动设备提供的“后退”按钮的返回历史记录!

IonicQuasar 等框架可以拦截移动设备后退按钮事件。 Quasar 为您处理这些事件并为桌面和移动平台构建调整行为,例如 Cordova/Capacitor 移动应用构建将确保“返回”操作可以智能地关闭对话框或返回页面甚至关闭应用程序!

【讨论】:

【解决方案6】:

如果您想在 Nuxt 中执行此操作,此方法对我有用

<nuxt-link :to="`${this.$nuxt.context.from.path}`" class="m-0 float-right btn btn-sm btn-sm btn-info">
   <i class="bi bi-plus-lg"></i> {{ $t('back') }}
</nuxt-link>

【讨论】:

    【解决方案7】:

    另一种解决方案是使用vue-router-back-mixin

    import BackMixin from `vue-router-back-mixin`
    
    export default {
      ...
      mixins: [BackMixin],
      methods() {
        goBack() {
          this.backMixin_handleBack()
        }
      }
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 2018-03-23
      • 2022-07-19
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2021-05-03
      相关资源
      最近更新 更多