Vue Router动态设置Meta

时间:2017-10-19 20:48:56

标签: vue.js vue-router

所以我有一个使用Vue和Vue路由器的SPA。它设置为iOS应用程序,当您更深入地查看视图时,导航栏中的标题会发生变化。现在我在routes.js文件中有这个硬编码但是想让它变得dynmaic。我可以在视图中更新路径元,但是在视图显示后渲染,所以我需要在路由更改之前进行。这是设置:

route.js

//A route
 {   
      path: '/team/:username', 
      component: require('./views/team-single'),  
      name: 'profile', 
      meta:{ requiresAuth: true, title: 'Team Member', tabbar: false } 
  }

navbar.vue

//if the route has a title show that not the logo
 <div class="navbar-item">

     <transition name="fadeup">
         <h1 v-if="$route.meta.title" class="navbar-title">{{ $route.meta.title }}</h1>
         <img src="/img/hopbak-green.svg" class="navbar-logo"  alt="hopbak" v-else>
     </transition>

 </div>

理想情况下,将:username放入route.js中的标题会很好,但我不认为这是可能的。我试过在视图中添加这样的东西,但就像我说它被调用到了晚了:

团队member.vue

mounted(){
   this.$route.meta.title = this.user.username
}

确实改变了它,但在导航栏已经加载之前没有改变它。

enter image description here

4 个答案:

答案 0 :(得分:4)

我在元数据中使用动态url参数时也遇到类似的问题,我通过将this.$route的meta属性作为函数进行评估来解决该问题。首先以这种方式配置meta属性:

//A route
 {   
      path: '/team/:username', 
      component: require('./views/team-single'),  
      name: 'profile', 
      meta: (route) => ({ requiresAuth: true, title: 'Team Member' + route.params.username, tabbar: false }) 
  }

然后您可以通过以下方式在模板中使用它:

//if the route has a title show that not the logo
 <div class="navbar-item">

     <transition name="fadeup">
         <h1 v-if="$route.meta != null" class="navbar-title">{{ $route.meta($route).title }}</h1>
         <img src="/img/hopbak-green.svg" class="navbar-logo"  alt="hopbak" v-else>
     </transition>

 </div>

答案 1 :(得分:2)

设置meta之后,我强制重新加载路由器,如下所示:

this.$route.meta.title = this.user.username

// add a temporary variable
this.$router.replace({query: {temp: Date.now()}})
// remove the temporary variable query
this.$router.replace({query: {temp: undefined}}

有许多变通方法强制重新加载此github issue中找到的路由器,这只是其中之一。

答案 2 :(得分:0)

您可以使用props来实现这样的目标。

{
  path: '/team/:username',
  name: 'profile',
  component: require('./views/team-single'),
  props: (route) => ({ title: route.params.username })
}

并且,在组件中:

props: ['title'],
...
mounted () {
  console.log('title: ' + this.title)
}
...

结帐文档了解更多信息:https://router.vuejs.org/en/essentials/passing-props.html

答案 3 :(得分:0)

//文字字符串路径 router.push('/users/eduardo')

// 带路径的对象 router.push({ path: '/users/eduardo' })

// 带有参数的命名路由,让路由器构建 url router.push({ name: 'user', params: { username: 'eduardo' } })

// 带查询,结果是 /register?plan=private router.push({ path: '/register', query: { plan: 'private' } })

// 带有哈希值,结果为 /about#team router.push({ path: '/about', hash: '#team' })

const 用户 ID = '123' router.push({ name: 'user', params: { userId } }) // -> /user/123 router.push({ path: drop1() }) // -> /user/123 // 这将不起作用 router.push({ path: '/user', params: { userId } }) // -> /user