美文网首页
vue3 ts 使用 vue-meta

vue3 ts 使用 vue-meta

作者: ci0n | 来源:发表于2021-06-01 10:36 被阅读0次

安装 vue-meta

npm i -S vue-meta@next

目前 vue-meta3 还是处于 alpha 阶段,不要低于 3.0.0-alpha.7

项目结构

.src
├── App.vue
├── global
│   └── vue-meta
│       ├── component.tsx
│       └── index.ts
├── main.ts
├── router
│   └── index.ts
└── views
    ├── About.vue
    └── Home.vue

开发

创建一个vue-meta的管理器,并 use 到 app 中

// global/vue-meta/index.ts
import { createMetaManager } from 'vue-meta'
export default createMetaManager(false, {})
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router'
import vueMetaManager from '@/global/vue-meta'

const app = createApp(App)

app
 .use(router)
 .use(vueMetaManager)

app.mount('#app')

创建一个组件,专门处理 meta

// global/vue-meta/components.tsx
import router from '@/router'
import { watch } from '@vue/runtime-core'
import { Options, setup, Vue } from 'vue-class-component'
import { SlotScopeProperties, useMeta } from 'vue-meta'

@Options<VueMeta>({
  render () {
    const slots = {
      title: ({ content }: SlotScopeProperties) => {
        return content ? `${content} | SITE_NAME` : 'SITE_NAME'
      },
    }

    // metainfo是全局组件,由vue-meta注入
    // 这里不可以使用 h('metainfo'),无法正确渲染 metainfo 组件。原因未知
    return <metainfo v-slots={slots} />
  },
})
export default class VueMeta extends Vue {
  protected meta = setup(() => {
    const { meta } = useMeta({
      title: '',
    })

    // 监听当前路由对象 修改 meta 信息
    watch(router.currentRoute, () => {
      const route = router.currentRoute.value

      const metaInfo = route.meta?.metaInfo ?? true

      // true:使用 route.meta.title
      // false:由页面组件通过 useMeta 修改
      // object:更新
      if (metaInfo === true) {
        meta.title = route.meta?.title || ''
      } else if (metaInfo && metaInfo !== false) {
        Object.assign(meta, metaInfo)
      }
    })

    return meta
  })
}

将组件放到 App.vue 中

<!-- App.vue -->

<template>
  <VueMeta />

  <div id="nav">
    <router-link to="/">
      Home
    </router-link> |
    <router-link to="/about">
      About
    </router-link>
  </div>
  <router-view />
</template>
<script lang="ts">
import { Options, Vue } from 'vue-class-component'
import VueMeta from '@/global/vue-meta/component'

@Options({
  components: {
    VueMeta,
  },
})
export default class Home extends Vue {
}
</script>

对于某些特殊的页面,可以在页面组件里修改meta

<!-- views/Info.vue -->
<script lang="ts">

import { Options, Vue, setup } from 'vue-class-component'
import { useMeta } from 'vue-meta'
export default class Info extends Vue {
    meta = setup(() => {
        const { meta } = useMeta({
          title: 'info',
        })
        return meta
    })
    
    mounted() {
        // 可以随时修改
        this.meta.title = '有新的消息'
    }
}
</script>

相关文章

  • vue-meta使用方法

    vue-meta使用方法 本文介绍Vue3中vue-meta的使用方法 meta标签用于设置HTML的元数据(描述...

  • vue3 ts 使用 vue-meta

    安装 vue-meta 目前 vue-meta3 还是处于 alpha 阶段,不要低于 3.0.0-alpha.7...

  • vue3 的一些知识点

    vue3 支持 jsx 安装依赖 vite.config.ts 中引用插件 使用 jsx CSS Module 任...

  • Vite2+vue3+ts 使用 router,layout 搭

    Vite2+vue3+ts 使用 router,layout 搭建页面框架,并做页面自适应 vue3 对应使用的是...

  • 2021-01-21

    今天做了什么有意思的事 1. vue3 + ts项目 2. vue3使用g2 今天学会了什么 今天居然没学到什么?...

  • vue CLI3中使用ts坑之路由篇

    今天想使用ts配置vue3路由,原本以为特别简单,毕竟在不使用ts的时候几乎可以说是闭着眼睛都可以做到的东西(允许...

  • 利用vscode安装vue3,并使用

    利用vscode安装vue3,并使用 1、打开终端ctrl+~ 2、安装过程 ts安装 vue-cli 3....

  • vue3与vue2的区别

    整体区别 使用proxy代替defineProperty实现数据相应试 vue3支持多个根元素 更好的ts支持 体...

  • 9、Vue3 crud案例

    基于vue3、vuex、vue-router、ts 案例 效果 案例 App.vue main.ts src/ro...

  • vue3+ts+electron踩坑记录

    本文包括vue3的基础环境搭建和electron配置,全TS。全部技术栈为:vue3+ts+antdv+vite+...

网友评论

      本文标题:vue3 ts 使用 vue-meta

      本文链接:https://www.haomeiwen.com/subject/aurwsltx.html