首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nuxt.js:如何从布局中引用页面数据?(例如,填充og:title标记)

Nuxt.js:如何从布局中引用页面数据?(例如,填充og:title标记)
EN

Stack Overflow用户
提问于 2019-12-06 15:41:00
回答 1查看 3.5K关注 0票数 2

我使用Nuxt.js生成静态页面。我希望每个页面都有一个唯一的<title>标签和<meta property="og:title" ... >标签。

目前执行情况

我目前有一个丑陋的解决方案来生成这些标记。我有两页是这样的:

pages/foo.vue

代码语言:javascript
复制
export default {
  head: {
    title: 'Foo',
    meta: [
      {
        property: 'og:title',
        content: 'Foo',
      },
    ],
  }
};

pages/bar.vue

代码语言:javascript
复制
export default {
  head: {
    title: 'Bar',
    meta: [
      {
        property: 'og:title',
        content: 'Bar',
      },
    ],
  }
};

问题

这正确地为我的每个页面生成了<meta property="og:title" ...>标记,但它迫使我在我的所有页面中包含冗余代码。我的og:title标记总是与我的<title>标记相匹配,因此在每个页面上独立地重新定义每个标记都是没有意义的。

期望解

我希望有一种解决方案,允许我在我的layouts/default.vue文件中甚至在nuxt.config.js中定义layouts/default.vue标记。就像这样:

layouts/default.vue

代码语言:javascript
复制
export default {
  head() {
    return {
      meta: [
        {
          property: 'og:title',
          content: this.$page.head.title, // <-- This variable doesn't really exist
        }
      ],
    };
  },
};

pages/foo.vue

代码语言:javascript
复制
export default {
  head: { title: 'Foo' }
};

pages/bar.vue

代码语言:javascript
复制
export default {
  head: { title: 'Bar' }
};

问题

有可能消除这里的样板吗?

更普遍地说,Nuxt布局有可能引用特定于页面的数据吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 15:19:46

Layout.vue不能直接从Page.vue访问nuxt数据。

为了在它们之间共享数据,您必须使用Store

请参阅https://nuxtjs.org/guide/vuex-store/

关于初始请求,可以使用Mixin在每个Page.vue上共享元配置。

请参阅https://v2.vuejs.org/v2/guide/mixins.html

例如:

代码语言:javascript
复制
// mixins/meta.vue

<script>
export default {
  data () {
    return {
      title: null,
      description: null
    }
  },
  head () {
   return {
     title = this.title
     meta = [
      { hid: 'description', name: 'description', content: this.description },
      { hid: 'og:title', property: 'og:title', content: this.title },
      // ...
    ]
  }
}
</script>
代码语言:javascript
复制
// <Page>.vue with local mixin

<script>
import Meta from '~/mixins/meta'

export default {
  mixins: [Meta], // local mixin
  asyncData () {
    return {
      title: "Foo",
      description: "lorem ipsum",
    }
  }
}
</script>

或者用Nuxt插件创建一个全局混合器:

代码语言:javascript
复制
// plugins/meta.js

import Vue from 'vue'

Vue.mixin({
  data: { // ... }
  head: { // ...}
})

并在每一页上声明您的新插件:

代码语言:javascript
复制
// nuxt.config.js

plugins: ['~/plugins/meta'],
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59216192

复制
相关文章

相似问题

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