vue-router中是否有router.reload?


101

我在此拉取请求中看到:

  • 添加一个 router.reload()

    重新加载当前路径并再次调用数据挂钩

但是,当我尝试从Vue组件发出以下命令时:

this.$router.reload()

我收到此错误:

Uncaught TypeError: this.$router.reload is not a function

我搜索了docs,但没有找到任何相关内容。vue / vue-router是否提供某些这样的功能?

我感兴趣的软件版本是:

"vue": "^2.1.0",
"vue-router": "^2.0.3",

PS。我知道这location.reload()是替代方法之一,但我正在寻找本机Vue选项。

Answers:


145

this.$router.go()正是这样做的;如果未指定任何参数,则路由器导航到当前位置,刷新页面。

注:目前执行的路由器它的历史分量不标记帕拉姆为可选,但IMVHO它要么错误或埃文您的部分不作为,因为该规范明确允许我已经提交了有关此问题的报告。如果您真的担心当前的TS批注,请使用等效的this.$router.go(0)

至于“为什么会这样”:在go内部将其参数传递给window.history.go,因此其等于windows.history.go()-进而根据MDN doc重新加载页面。

注意:由于此操作会在常规桌面(非便携式)Firefox上执行“软”重新加载,因此,如果使用它,可能会出现一堆奇怪的怪癖,但实际上您需要真正的重新加载;使用OP提到的window.location.reload(true);https://developer.mozilla.org/en-US/docs/Web/API/Location/reload)可能会有所帮助-它确实解决了我在FF上的问题。


4
是的,它正在刷新页面,而不是重新加载组件。
EscapeNetscape

<span @click =“()=> {this。$ router.go()}” class =“ btn btn-lg btn-danger”>
Vsevolod Azovsky,

9
请注意,$router.go()该参数接受一个参数,因此您应该将其用作$router.go(0),这意味着可以将历史记录导航到零页

1
@Dan FWIW,我要说一个事实,就是github.com/vuejs/vue-router/blob/dev/src/index.js#L175及其实现(例如github.com/vuejs/vue-router/blob/ dev / src / history / html5.js#L40)不要将参数标记为可选,因为它是Evan You的错误或遗漏,因为该规范已明确允许它(请参阅developer.mozilla.org/en-US/ docs / Web / API / History / go#Parameters)。我已经提交了关于它的错误报告@ github.com/vuejs/vue-router/issues/3065

window.location.reload(forceReload)似乎已弃用,但window.location.reload()还可以。
亨农

46

最简单的解决方案是将:key属性添加到:

<router-view :key="$route.fullPath"></router-view>

这是因为如果寻址相同的组件,Vue Router不会注意到任何更改。使用该键,对路径的任何更改都将触发使用新数据重新加载组件。


1
官方文档中的vuejs.org/v2/api/#key间接解释了vue中的key special属性的机制。
伊恩·品度(Ian Pinto)

2
这将不起作用,因为在这种情况下,OP正在讨论完整路径。
Nick Coad

对我来说很棒。提出了这个答案。
ak22年

27
this.$router.go(this.$router.currentRoute)

Vue路由器文档:

我在GitHub上检查了vue-router存储库,似乎不再有reload()方法了。但是在同一文件中有:currentRoute对象。

来源:vue-router / src / index.js
文件:docs

get currentRoute (): ?Route {
    return this.history && this.history.current
  }

现在您可以this.$router.go(this.$router.currentRoute)用于重新加载当前路线。

简单的例子

此答案的版本:

"vue": "^2.1.0",
"vue-router": "^2.1.1"

1
这不会刷新任何数据Safari
吉伦

7
有没有一种方法可以只重新加载组件,而无需刷新页面?路由应该相同,比方说'/ users'。但是,当我单击刷新按钮时,它必须刷新整个页面,而无需重新加载页面。
Rajeshwar '18

7

使用router.go(0)如果使用打字稿,并且它要求的参数为细末方法。


5

router.js

routes: [
{
  path: '/',
  component: test,
  meta: {
    reload: true,
  },
}]

main.js

import router from './router';

new Vue({
  render: h => h(App),
  router,
  watch:{
    '$route' (to) {
       if(to.currentRoute.meta.reload==true){window.location.reload()}
   }
 }).$mount('#app')

2

这是我的重载。由于某些浏览器很奇怪。location.reload无法重新加载。

methods:{
   reload: function(){
      this.isRouterAlive = false
      setTimeout(()=>{
         this.isRouterAlive = true
      },0)
   }
}
<router-view v-if="isRouterAlive"/>

1

解析到URL的路由,并使用Javascript导航窗口。

        let r = this.$router.resolve({
        name: this.$route.name, // put your route information in
        params: this.$route.params, // put your route information in
        query: this.$route.query // put your route information in
      });
      window.location.assign(r.href)

此方法替换URL,并使页面执行完整请求(刷新),而不是依赖Vue.router。即使从理论上来说,$ router.go对我来说也不起作用。


1
`<router-link :to='`/products`' @click.native="$router.go()" class="sub-link"></router-link>`

我已经尝试过重新加载当前页面。


-1
function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                          + window.location.search);
}


App.$router.replace({name:"my-route", hash: '#update'})
App.$router.replace({name:"my-route", hash: ' ', params: {a: 100} })
setTimeout(removeHash, 0)

笔记:

  1. 并且#必须具有一定的价值。
  2. 第二个路由哈希是一个空格,而不是空字符串。
  3. setTimeout,不要$nextTick保持网址干净。

-1

对于重新渲染,您可以在父组件中使用

<template>
  <div v-if="renderComponent">content</div>
</template>
<script>
export default {
   data() {
      return {
        renderComponent: true,
      };
    },
    methods: {
      forceRerender() {
        // Remove my-component from the DOM
        this.renderComponent = false;

        this.$nextTick(() => {
          // Add the component back in
          this.renderComponent = true;
        });
      }
    }
}
</script>

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.