似乎Vue Meta已经升级到处理Vue.js 3和一个名为vue-3-meta的新npm包

在Vue之前.js 3,通过将其添加到Vue实例中,可以轻松使用vue-meta:

import Vue from 'vue'
import VueMeta from 'vue-meta'
 
Vue.use(VueMeta, {
  // optional pluginOptions
  refreshOnceOnNavigation: true
})

然而在Vue中.js 3,没有Vue实例;而是通过运行createApp来创建应用程序,如下所示:

const app = createApp(App);
const router = createVueRouter();

app.use(router);
// need to make app use Vue-Meta here

我找不到vue-3-meta美元的任何文件.import VueMeta from 'vue-meta'不再有效.

如何正确导入vue-3-meta插件,并与之前版本中的app插件一起使用?

推荐答案

Disclaimer: vue-meta v3 is still in alpha!

这是我开始工作所需的最低限度的实现:

  1. vue-meta更新为v3(在package.json中)

    - "vue-meta": "^2.4.0",
    + "vue-meta": "^3.0.0-alpha.7",
    

    ...或者用Yarn :

    yarn add vue-meta@alpha
    
  2. 添加metaManager到Vue应用程序

    import { createMetaManager } from 'vue-meta'
    
    const app = createApp(App)
      .use(router)
      .use(store)
      .use(createMetaManager()) // add this line
    
    await router.isReady()
    app.mount('#app')
    
  3. 在应用程序中添加<metainfo>.vue <template>(这也是我设置"标题模板"的地方)

    <template>
      <metainfo>
        <template v-slot:title="{ content }">{{ content ? `${content} | SITE_NAME` : `SITE_NAME` }}</template>
      </metainfo>
      <header />
      <router-view />
      <footer />
    </template>
    
  4. Set default meta in App.vue <script>
    Vue 3 vanilla:

    import { useMeta } from 'vue-meta'
    
    export default {
      setup () {
        useMeta({
          title: '',
          htmlAttrs: { lang: 'en', amp: true }
        })
      }
    }
    

    or with 100:

    import { setup, Vue } from 'vue-class-component'
    import { useMeta } from 'vue-meta'
    
    export default class App extends Vue {
      meta = setup(() => useMeta({
        title: '',
        htmlAttrs: { lang: 'en', amp: true }
      })
    }
    
  5. Override meta in each component
    Vue 3 vanilla:

    import { useMeta } from 'vue-meta'
    
    export default {
      setup () {
        useMeta({ title: 'Some Page' })
      }
    }
    

    or with 100:

    import { computed } from '@vue/runtime-core'
    import { setup, Vue } from 'vue-class-component'
    import { useMeta } from 'vue-meta'
    
    export default class SomePage extends Vue {
      meta = setup(() => useMeta(
        computed(() => ({ title: this.something?.field ?? 'Default' })))
      )
    }
    

另见:

Vue.js相关问答推荐

禁用 vue-cli webpack 编码图像 base64

Vue:在表格中显示嵌套数据

Vue CLI - 编译后将配置文件保留为外部

用 axios 搜索:新字符时取消之前的请求

使用 v-slot:body 时 Vuetify v-data-table 没有响应

如何在Typescript语言Vuejs中使用watch功能?

可以同时使用 Tailwind css 和 Bootstrap 4 吗?

apache上的Vue-router,子目录下的SPA,只能通过重定向访问页面

即使在客户端设置 Access-Control-Allow-Origin 或其他 Access-Control-Allow-* 标头后也出现 CORS 错误

如何在 vue 3 中获取路由的参数?

在Vue.js中从父组件执行子方法

阻止 Vue 积极重用 dom 元素

Vuetify v-btn 路由活动类问题

axios 拦截器响应未定义

是否可以从 vue-devtools 中排除 vue 事件和 vuex Mutations?

从 ajax 调用填充 Vue.js 中的下拉列表

vuejs 配置:使用全局变量?

Vue.JS 2.0 修改不相关数据时速度慢

如何访问通用 javascript 模块中的当前路由元字段

为什么不能在 vue 模板中使用窗口?