如何在 Vue 路由器中定义要在组件内部使用的变量?

Posted

技术标签:

【中文标题】如何在 Vue 路由器中定义要在组件内部使用的变量?【英文标题】:How to define variables in Vue router to be used inside components? 【发布时间】:2021-06-04 21:58:42 【问题描述】:

我在顶部有一个导航栏,在它的正下方有一个<router-view>(如App.vue 所示)。我希望导航栏中的标题根据我所在的路线/视图而改变。由于我在<router-view> 中的视图不包含标题本身,因此我需要在某处定义它们。例如,当到达路线/login 时,导航栏中的标题变为“登录”。 我如何做到这一点?

在寻找解决方案时,我遇到了很多页面标题问题。我不是在谈论 document.title 分配,但是,这可能是一个解决方案,但不是一个完美的解决方案。如果我希望标题不是文档标题怎么办..

App.vue:

<template>
  <Menu :isActive="isMenuActive" />
  <Navbar @toggle:hamburger="onHamburgerToggle($event)" />
  <router-view />
</template>

【问题讨论】:

【参考方案1】:

每个组件都可以访问$route 对象,因此您可以直接在模板中使用它。或者,您可以在脚本中访问该对象并对其进行处理。

假设您的路线具有name 属性:

路由器/index.js

routes: [
   path: '/', name: 'home', component: Home ,
   path: '/foo', name: 'foo', component: Foo ,
   path: '/bar', name: 'bar', component: Bar 
]

您可以在模板中显示该名称而无需脚本:

Navbar.vue

<template>
  <div>Title:  $route.name </div>
</template>

meta 也是一个好主意,如 @MichalLevý 的 answer 中所述。)

或者您可以访问脚本中的路由对象并根据需要创建标题。

Navbar.vue(组合 API)

<template>
  <div>Title:  title </div>
</template>
<script>
import  ref  from 'vue';
import  useRoute  from 'vue-router';

export default 
  setup() 
    const route = useRoute();
    const title = ref('My title ' /* Do something with `route` */);
    return  title 
  

</script>

【讨论】:

我发现这样做是个好主意:const title = computed(() =&gt; route.meta.title || 'default title'); - 这样它会在标题更改时更新。也许可以在路由器中设置默认值,但是您必须将其分配给每个路由.. 很高兴为没有meta 的路由提供回退。如果您只是使用meta,则不需要使用计算脚本或任何脚本。您可以将其直接放入模板中: $route.meta.title || 'default title' 你是对的。不需要额外的步骤。在我的项目中,我有两个标题,具体取决于标题,它改变了位置:) 这是 Michal 的建议,所以如果您不需要对组件进行任何修改,我建议您接受他的回答【参考方案2】:

Vue 路由器允许您使用 Route Meta Fields 将您想要的任何信息附加到任何路由

const router = new VueRouter(
  routes: [
    
      path: '/foo',
      component: Foo,
      meta:  title: "FOO" 
          
  ]
)

您可以使用$route variable 访问任何组件中当前活动路由的信息

const child = Vue.component('child', 
  template: `
  <div>
    Child component (" $route.meta.title ")
  </div>
  `
)

const router = new VueRouter(
  mode: 'history',  
  routes: [
    
      name: 'route1',
      path: '/route1',
      component: child,
      meta:  title: 'Hello from route 1!'
    ,    
    
      name: 'route2',
      path: '/route2',
      component: child,
      meta:  title: 'Hello from route 2!'
    ,    
  ]
)

new Vue(
  el: '#app',
  router,
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
  <router-link to="/route1">Route 1</router-link>
  <router-link to="/route2">Route 2</router-link>
  
  <h4> Current route:  $route.meta.title  </h4>

  <router-view></router-view>
</div>

【讨论】:

以上是关于如何在 Vue 路由器中定义要在组件内部使用的变量?的主要内容,如果未能解决你的问题,请参考以下文章

vue路由器组件变量未定义

vue 强制刷新组件

Vue路由守卫(全局路由守卫、路由独享守卫、组件内部守卫)

vue路由自动加载、按组件异步载入vuex以及dll优化

Vue3组件——父组件通过ref获取子组件内部信息失败

elementui导航菜单通过路由跳转怎么活跃状态