Vue-router 组件复用

Posted

技术标签:

【中文标题】Vue-router 组件复用【英文标题】:Vue-router component reusing 【发布时间】:2019-03-01 11:42:30 【问题描述】:

我想知道如何在 Vue-router 中停止组件重用。

我正在构建一个简单的页面应用程序,但我无法在单击同一链接两次后更新数据。

是否有可能以某种方式强制重新加载或在我的情况下最佳做法是什么?

【问题讨论】:

【参考方案1】:

使用router-view 上的key 属性设置为当前网址。它是内置的,因此无需编写任何代码。

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

【讨论】:

这是否意味着每个组件总是在路由更改时重新渲染? 当路径(URL)改变时,整个视图被重新渲染。【参考方案2】:

Vue 路由器重用相同的组件,因此不会调用挂载的钩子。如文档中所述:

相同的组件实例将被重用[...]组件的生命周期钩子不会被调用。

如果您想更新数据,您有两种选择:

观察 $route 对象

const User = 
  template: '...',
  watch: 
    '$route' (to, from) 
      // react to route changes...
    
  
使用 beforeRouteUpdate 导航保护

const User = 
  template: '...',
  beforeRouteUpdate (to, from, next) 
    // react to route changes...
    // don't forget to call next()
  

有关更详细的说明,您可以查看 Vue 路由器文档的响应参数更改部分:https://router.vuejs.org/guide/essentials/dynamic-matching.html#reacting-to-params-changes。

【讨论】:

【参考方案3】:

一种方法是在router-view 上放置一个键,并将时间戳查询字符串附加到您的router-link

const Home = 
    template: '<div>Home</div>',
    created() 
        console.log('This should log everytime you click home.');
    ,
;

const router = new VueRouter(
    mode: 'history',
    routes: [
         path: '/', component: Home ,
    ]
);

new Vue(
    router,
    el: '#app',
);
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>


<div id="app">
  <router-link :to="`/?q=$Date.now()`">/home</router-link>
  <router-view :key="$route.fullPath"></router-view>
</div>

不这样做的一个原因是因为它会强制重新渲染您可能希望重用的组件,例如像

这样的路由 /posts/1 /posts/2

【讨论】:

澄清一下...当我向我的 API 发送删除另一台设备上的帖子的请求,同时我在另一台设备上打开了所有帖子时会怎样?预期的行为(至少在我的情况下)是当我再次单击同一链接时,数据应该重新加载。但是什么也没发生。 @user8540556 您的数据是存储在组件本地还是 vuex 中? GET 请求是在组件中发送还是在其他地方发送? 本地存储。请求在组件的mounted()方法中发送。 @user8540556 您是否看到单击链接时再次发送请求?如果是,返回的数据是否正确?

以上是关于Vue-router 组件复用的主要内容,如果未能解决你的问题,请参考以下文章

vue-router复用组件时不刷新数据

vue-router 组件实例被复用问题

vue-router路由守卫

18、 vue-router导航解析及钩子函数

vue-router钩子beforeRouteEnter函数获取到this实例

vue-router两个不同的路由共用一个component的问题