vue与vue-router搭配设置TDK

vue与vue-router搭配设置TDK

参考链接:使用Vue.js和vue-router更新页面标题和元数据

目录

vue与vue-router搭配设置TDK

TDK配置meta.js

路由配置index.js

设置main.js

启动应用程序


文档结构:

|- src

|-- components

|--- index.vue

|--- about.vue

|-- router

|--- index.js

|--- meta.js

|-- App.vue

|-- main.js

TDK配置meta.js

const maping = {
    home: {
        title: '首页',
        metaTags: [
            {
                name: 'keywords',
                content: 'home,vue, router, meta',
            },
            {
                name: 'description',
                content: '这是首页的一段描述',
            },
        ]
    },
    about: {
        title: '关于',
        metaTags: [
            {
                name: 'keywords',
                content: 'about, vue, router, meta',
            },
            {
                name: 'description',
                content: '这是关于的一段描述',
            },
        ]
    },
};

export default maping;

路由配置index.js

import Vue from 'vue'
import Router from 'vue-router'

import maping from './mate.js'

import Index from '@/components/index'
import About from '@/components/about'

Vue.use(Router)

const RouterHome = {
    path: '/',
    name: 'index',
    component: Index,
    meta: maping.index,
};

const RouterAbout = {
    path: '/',
    name: 'about',
    component: About,
    meta: maping.about,
};

const router = new Router({
    mode: 'history',
    routes: [
        RouterHome,
        RouterAbout,
    ],
});

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);

    console.log(previousNearestWithMeta);

    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();
});

export default router;

设置main.js

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

new Vue({
    el: '#app',
    router,
    components: { App },
    template: '<App/>'
})

启动应用程序

npm run dev

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值