Ошибки: "[Предупреждение Vue]: свойство или метод" posts "не определены в экземпляре, но на них ссылаются во время рендеринга". а также для "книг"

введите описание изображения здесь Я создаю приложение в Nuxt и использую storyblok в качестве моей CMS. Однако я получал ошибки при попытке связать массив storyblok с моими массивами, вызываемыми в моем шаблоне с помощью v-for.

Вот шаблон:

<template>
<div>
<!-- instance header -->
<InstanceHeader title="Books" />

<div class="pageContainer">

<div class="booksInfoPost"> 

    <div class="booksInfoPost__subHeader"><h3>Top Books</h3></div>

    <div class="booksInfoPost__topBooks"> 

     <BooksInfoPostTop 
        v-for="book in books"
        :key ="book.id"
        :bookCover="book.bookCover"
        :title="book.title"
        :author="book.author"
        :content="book.content"
        :id="book.id"
        /> 

    </div> 

    <div class="booksInfoPost__subHeader"><h3>Book Titles</h3></div>

     <BooksInfoPost 
        v-for="book in posts"
        :key ="book.id"
        :bookCover="book.bookCover"
        :title="book.title"
        :author="book.author"
        :content="book.content"
        :id="book.id"
        />  

    </div>
</div>

Вот мой сценарий:

export default  {

components: {
    InstanceHeader,
    BooksInfoPostTop,
    BookTitles,
    BooksInfoPost
},

data() {
    /* return {
        books: [],
        posts: []
    } */

},

async asyncData(context) {

     return {

      bookTitles:  context.app.$storyapi
      .get("cdn/stories", { version: "draft", starts_with: 'books/book-titles'})
      .then(response => {
     console.log(response);
        return  {
            posts: response.data.stories.map(bp => {
                return {
                    id: bp.slug,
                    bookCover: bp.content.bookCover,
                    title: bp.content.title,
                    author: bp.content.author
                    };
            }),
        }   
    }),

    topBooks:  context.app.$storyapi
      .get("cdn/stories", { version: "draft", starts_with: 'books/top-books'})
      .then(response => {
     console.log(response);
        return  {
            books: response.data.stories.map(b => {
                return {
                    id: b.slug,
                    bookCover: b.content.bookCover,
                    title: b.content.title,
                    author: b.content.author
                    };
            }),
        }   
    })


  } 


} 
}

Я заметил эту ошибку больше, когда пытался вызвать два API из storyblok. Когда я вызвал один вызов API, я не увидел этой ошибки. Я также пробовал использовать Axios, но при использовании этого метода тоже получаю ошибки. Я не самый опытный разработчик, и если кто-то может помочь, я буду признателен. Спасибо

1 ответ

export default {

  components: {
    InstanceHeader,
    BooksInfoPostTop,
    BookTitles,
    BooksInfoPost
  },

  async asyncData(context) {
    const result = {};
    const mapBooks = b => {
      return {
        id: b.slug,
        bookCover: b.content.bookCover,
        title: b.content.title,
        author: b.content.author
      };
    };

    const { data } = await context.app.$storyapi
      .get("cdn/stories", {
        version: "draft",
        starts_with: 'books/book-titles'
      });

    result.posts = data.stories.map(mapBooks);

    const result = await context.app.$storyapi
      .get("cdn/stories", {
        version: "draft",
        starts_with: 'books/top-books'
      });

    result.books = result.data.stories.map(mapBooks);

    return result; // it has right property names {books:[], posts:[]}
  }
}

Ну, как вы упомянули в комментарии, раньше это был небольшой беспорядок. Так что я прибрался. Идея в том, что вам нужны прямые имена свойств вместо вложенных объектов. Таким образом, он должен работать, если он не работает, проверьте вкладку сети на наличие ошибок.

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