当 url 匹配相同的路由时,vue3 router.push 不更新组件?

Posted

技术标签:

【中文标题】当 url 匹配相同的路由时,vue3 router.push 不更新组件?【英文标题】:vue3 router.push doesn't update the component when url match the same route? 【发布时间】:2021-09-09 21:42:12 【问题描述】:
在子组件中我遇到了一些问题。

路由器配置路径“/blog/:user/:article”

文件“Article.vue”

defineComponent(
  setup() 
    console.log("Call setup()"); // Debug info

    const route  = useRoute();
    const router = useRouter();
    const store  = useStore(); // vuex
    
    // here omits many details.
    // some axios requests depend on the variables above.

    // problem come here
    // this is a function bind to a table(or list) display in <template>.
    // but the route must change and I need to update this component based on the row.
    const rowClick = (row) => 
      router.push("/blog/" + user + "/" + row.Name);
    
    return  rowClick ;
  
)

但这不起作用,因为路由器认为它是同一个组件,并拒绝重新加载该组件。

所以我在调试控制台中看不到调试信息。

我已经尝试过。

首先我只是使用 location.replace 来强制应用程序重新加载整个页面。

但这并不优雅,它需要更多时间来重新加载并且历史已经消失。

然后我尝试观看 route.params 但我的sonsole 记录了一个 vue 警告,告诉我观看源必须是 ref 反应性 obj 并且路由器推送仍然不更新组件。

watch(route.params, (previous, current) => 
  console.log(`$previous and $current`); // Debug info
)

我很困惑! vue3的设置需要注意什么?

更多信息
const routes: Array<RouteRecordRaw> = [
 
  path: "/home",
  alias: "/",
  name: "Home",
  component: Home
 ,
 
  path: "/blog/:user/:article?",
  name: "Article",
  component: () => import(/* webpackChunkName: "article" */ "@/views/Article.vue"),
 ,
];

export default createRouter(
 history: createWebHistory(),
 routes: routes,
);

注意:这是我的第一个vue项目~

【问题讨论】:

试用router.push( name: 'Article', params: user: user,article:row.Name , replace:true ); @Boussadjra Brahim 这似乎什么也没做,我看到 Sonsole 调用 rowClick,浏览器的 url 更改和历史记录已添加,但 setup 只调用了一次。我想我必须向 watch() 寻求帮助! 为什么要看路线? 在模板中使用&lt;router-link&gt;而不是行链接时是否有效?这可以帮助缩小问题范围。 @Boussadjra Brahim 我在github上添加了一个预上传版本,你可以阅读最详细的'Article.vue',v-html取决于需要更新的内容。所以我想使用watch更新内容的路由,这是这个页面的核心。 【参考方案1】:

尝试观看路线参数,例如:

watch(()=>route.params, (previous, current) => 
  console.log(`$previous and $current`); 
,
deep:true)

注意:使用()=&gt;route.params代替route.params并添加deep选项

【讨论】:

【参考方案2】:

push 方法实际上返回了一个Promise,可以用来处理更新的路由:

this.$router.push("/blog/" + user + "/" + row.Name)
  .then(() => 
    console.log('Updated route', this.$route)
    // process the updated route params
  )

【讨论】:

以上是关于当 url 匹配相同的路由时,vue3 router.push 不更新组件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 vue3 路由重新加载页面时出现错误 404

vue3.0 路由重定向

AngularJS之Route

4.2 Routing -- Defining Your Routes

当多个路径匹配时,Express 如何知道使用哪个路由器路径?

深入Vue3学习vue-router vuex