【发布时间】:2019-03-01 11:42:30
【问题描述】:
我想知道如何在 Vue-router 中停止组件重用。
我正在构建一个简单的页面应用程序,但我无法在单击同一链接两次后更新数据。
是否有可能以某种方式强制重新加载或在我的情况下最佳做法是什么?
【问题讨论】:
标签: vue.js vuejs2 vue-component vue-router
我想知道如何在 Vue-router 中停止组件重用。
我正在构建一个简单的页面应用程序,但我无法在单击同一链接两次后更新数据。
是否有可能以某种方式强制重新加载或在我的情况下最佳做法是什么?
【问题讨论】:
标签: vue.js vuejs2 vue-component vue-router
使用router-view 上的key 属性设置为当前网址。它是内置的,因此无需编写任何代码。
<router-view :key="$route.fullPath"></router-view>
【讨论】:
Vue 路由器重用相同的组件,因此不会调用挂载的钩子。如文档中所述:
相同的组件实例将被重用[...]组件的生命周期钩子不会被调用。
如果您想更新数据,您有两种选择:
const User = {
template: '...',
watch: {
'$route' (to, from) {
// react to route changes...
}
}
}
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。
【讨论】:
一种方法是在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【讨论】:
GET 请求是在组件中发送还是在其他地方发送?