首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >元标记不适用于Vue-router

元标记不适用于Vue-router
EN

Stack Overflow用户
提问于 2018-08-19 14:15:41
回答 1查看 6.6K关注 0票数 2

我使用的是webpack的Vue模板:vue init webpack router-app

在“router-app/src/router/index.js”中设置元标题:

代码语言:javascript
复制
export default new Router({
  mode: 'history',
  routes: [
    {
      path: '*',
      component: NotFoundComponent
    },
    {
      path: '/',
      name: 'LoginPage',
      meta: { title: 'Home', bodyClass: 'dashboard' },
      component: LoginPage
    }
  ]
})

LoginPage.vue:

代码语言:javascript
复制
<template>
  <form>
  ...
  </form>
</template>

<script>
export default {
  name: 'LoginPage',
  data () {
    return {
      msg: 'Login Page'
    }
  }
}
</script>

但这根本不会影响我的元标题。在vue dev-tools (Chrome)中,我可以看到$route有我的meta标签。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-19 14:48:35

如果您没有包含导航卫士,这里有一篇很棒的文章here中的函数。而且它工作得很好。

如果你只需要改变标题,你可以这样做

代码语言:javascript
复制
meta: {
  title: 'About Page - Example App'
}

将此内容插入route.js或(如果不是app.js)

代码语言:javascript
复制
 router.beforeEach((to, from, next) => {

    const nearestWithTitle = to.matched.slice().reverse().find(r => r.meta && r.meta.title);

    if (nearestWithTitle) document.title = nearestWithTitle.meta.title;

    next();
});

如果您需要更改元标记的名称和其他名称,那么为了灵活性,您需要完整的函数

代码语言:javascript
复制
router.beforeEach((to, from, next) => {

    const nearestWithTitle = to.matched.slice().reverse().find(r => r.meta && r.meta.title);

    const nearestWithMeta = to.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);
    const previousNearestWithMeta = from.matched.slice().reverse().find(r => r.meta && r.meta.metaTags);

    if (nearestWithTitle) document.title = nearestWithTitle.meta.title;

    Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map(el => el.parentNode.removeChild(el));

    if (!nearestWithMeta) return next();

    nearestWithMeta.meta.metaTags.map(tagDef => {
            const tag = document.createElement('meta');

            Object.keys(tagDef).forEach(key => {
                tag.setAttribute(key, tagDef[key]);
            });

            tag.setAttribute('data-vue-router-controlled', '');

            return tag;
        })
        .forEach(tag => document.head.appendChild(tag));

    next();
});
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51915013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档