Vue Router 路由跳转后页面不刷新怎么办?
我在用 Vue 3 + Vue Router 做一个后台管理系统,发现从 /user/list 跳到 /user/detail?id=123 的时候,页面内容没变,组件好像没重新加载。明明数据应该不一样啊,是不是因为两个路由用的是同一个组件?
我试过在 beforeRouteUpdate 里手动 fetch 数据,但感觉很麻烦。有没有更简单的办法让路由变化时强制刷新组件?
<!-- router/index.js 中的路由配置 -->
{
path: '/user/detail',
name: 'UserDetail',
component: () => import('@/views/UserDetail.vue')
},
{
path: '/user/list',
name: 'UserList',
component: () => import('@/views/UserList.vue')
}
最简单粗暴的办法:给 router-view 加上 key
打开你的 App.vue 或者布局文件,找到 router-view,改成下面这样:
这样每次路由变化时,key 值不一样,Vue 就会把组件销毁重建,生命周期钩子正常触发,页面自然就刷新了。
如果你是从 /user/detail?id=1 跳到 /user/detail?id=2 这种同组件不同参数的情况,这个办法特别管见。如果是跨组件跳转(比如你描述的从 list 到 detail),理论上不应该复用到,但加上 key 肯定没问题。
另外提醒一下,强制刷新组件会销毁重建,如果有未保存的数据或者正在进行的请求,记得做好清理,避免内存泄漏或者请求回来后组件已经销毁了还去更新状态。安全起见,最好在 onUnmounted 或者 beforeUnmount 里把那些定时器、请求啥的清理掉。