Nuxt.js не может обновлять свойства head() из asyncData()

Я создал блог Vue.js, отображаемый на стороне сервера, используя Nuxt.js с Typescript и Ghost, но у меня возникли проблемы с обновлением метатега html с использованием данных из asyncData().

Из документации Nuxt.js я знаю, что asyncData() вызывается каждый раз перед загрузкой компонентов страницы и объединяется с данными компонента.

Я получаю эту ошибку:

Свойство title не существует для типа '{ asyncData({ app, params }: Context): Promise<{ title: string | неопределенный; выдержка: строка | неопределенный; feature_image: Обнуляемый | неопределенный; html: Обнуляемый | неопределенный; }>; голова(): любая; }'.

Это мой код:

<script lang = "ts">
import { Context } from '@nuxt/types'
import { PostOrPage } from 'tryghost__content-api'

export default {
  async asyncData ({ app, params }: Context) {
    const post: PostOrPage = await app.$ghost.posts.read(
      {
        slug: params.slug
      },
      { include: 'tags' }
    )

    return {
      title: post.title,
      excerpt: post.excerpt,
      feature_image: post.feature_image,
      html: post.html
    }
  },

  head () {
    return {
      title: this.title,
      meta: [
        {
          hid: 'description',
          name: 'description',
          content: this.excerpt
        }
      ]
    }
  }
}
</script>

Я уже пробовал некоторые решения, такие как использование data() для установки значения по умолчанию для каждого элемента, но ничего. Есть ли у вас предложения?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
42
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Без плагина typescript, такого как nuxt-property-decorator, у вас не будет поддержки Typescript для nuxt (в любом случае проверка типов и автозаполнение по-прежнему не будут работать).

Вот почему asyncData и fetch должны быть в параметрах компонента.

@Component({
  asyncData (ctx) {
    ...
  }
})
export default class YourClass extends Vue {
...
}

вместо

@Component
export default class YourClass extends Vue {
  asyncData (ctx) {
    ...
  }
}

Если вы все еще хотите использовать asyncData() внутри класса вашего компонента вместо установки параметра, см. этот рабочий пример с использованием модуля npm nuxt-property-decorator.

Вот рабочий код после реализации предложения @nonNumericalFloat:

import { Component, Vue } from 'nuxt-property-decorator'
import { Context } from '@nuxt/types'
import { PostOrPage } from 'tryghost__content-api'

import Title from '~/components/Title.vue'

@Component({
  components: {
    Title
  }
})
export default class Page extends Vue {
  post!: PostOrPage

  async asyncData ({ app, params }: Context) {
    const post: PostOrPage = await app.$ghost.posts.read(
      {
        slug: params.slug
      },
      { include: 'tags' }
    )

    return {
      post
    }
  }

  head () {
    return {
      title: this.post.title,
      meta: [
        {
          hid: 'description',
          name: 'description',
          content: this.post.excerpt
        }
      ]
    }
  }
}

Другие вопросы по теме