Vue Router动态路由跳转后组件不更新怎么办?
在用Vue3+Vue Router做动态路由时遇到个问题,当通过router.push('/user/'+id)跳转同一路径不同参数的页面,组件内容没重新渲染。试过在onBeforeMount里请求数据,但参数变化时只会调用onMounted钩子,数据还是旧的。
路由配置是这样的:
const routes = [
{
path: '/user/:id',
component: UserPage,
props: true
}
]
现在只能在组件里用watch监听$route对象手动调用获取数据的方法,但感觉不太优雅,应该还有更好的解决方式吧?
key来解决,给UserPage组件加个唯一的key,让Vue知道路由参数变化时需要重新渲染。像这样:这样每次路由变化都会强制重新渲染组件,应该能用。我一般都这么处理,简单粗暴有效。
一个比较优雅的解决方案是利用 Vue Router 提供的
onBeforeRouteUpdate导航守卫。这个钩子专门用来监听同一组件内的路由变化。你可以在组件里这样写:这里我把路由参数通过
props: true的方式传进来了,你可以直接在组件里通过 props 拿到 id 参数。当路由参数变化时,onBeforeRouteUpdate会被触发,然后你就可以在这里调用数据获取方法。对了,记得确保路由配置里写了
props: true,就像你问题里贴出来的那样,这样可以简化参数传递的过程。这样做既避免了 watch 手动监听 $route 的麻烦,又能让代码更清晰。我之前试过好几种方式,觉得这种方式最舒服,推荐你试试看!