如何在vue-router上回退/回退?


72

好的,简单解释一下:

我有3页。

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

第1页有-

<router-link  to="/menu">

单击该按钮将转到“ /菜单”。

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

<router-link  to="/">

按钮,然后单击此按钮,它将返回到先前的位置“ /”第1页(主页)。

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

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

提前致谢!约翰



@ yuriy636的答案可能是最好的。当前,我们有一个带有back按钮的外部组件,该按钮在当前url上使用字符串操作返回到路由的最后一页。现在,我们有机会时可能会更改为router.go方法
Kartik Prasad

好,谢谢!它正盯着我!我不太确定如何将此写入我的语法中。抱歉! 我是新来的!
John107 '18

Answers:


195

您可以使用程序化导航。要返回,请使用以下命令:

router.go(n) 

其中n可以为正或负(返回)。这与history.back()相同,因此您可以使用以下元素:

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

有人在IE11上有任何问题吗?例如,如果我通过router-link打开页面,请单击我的按钮,它会返回,但是,如果我通过router-link打开同一页面,则会router.go(-1)清除我的URL,但是什么也没有发生。
PanPipes

如果没有id加载,我想返回上一页,它可以正常工作,但是在页面刷新时,go(-1)返回2页而不是1页。
Aravindh Gopi,

Noob问题,我们可以a在这里使用标记而不是路由器链接

1
@ Hego555我相信router-link是a默认情况下呈现标签的组件
Steven Soroka

这似乎忽略了您要返回的上一个URL中的所有URL参数。
Titan

13

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

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>

1
如果您来自应用程序外部的另一个网站,则认为可以返回到应用程序的上一页,但实际上您会将其留给外部网站使用。
恩里克A.


6

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

只需使用以下命令在您的主文件中对其进行初始化:

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

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

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

您也可以将其放在<router-link>组件中:

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

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


4
这会导致无限循环问题
TonyGW

@TonyGW不,不是。
pishpish

-3

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

import BackMixin from `vue-router-back-mixin`

export default {
  ...
  mixins: [BackMixin],
  methods() {
    goBack() {
      this.backMixin_handleBack()
    }
  }
  ...
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.