Данные отображаются на экране, но с ошибкой на консоли (Firebase с Vue): не перехвачено (в обещании) TypeError: невозможно прочитать «содержимое» свойства, равное нулю

Я пытаюсь отобразить урок. содержание на экране, но у меня есть ошибки на консоли. Вот код (я использую Firebase с Vue 3)

<template>
  <AddContent :lesson = "lesson" />
  <div v-if = "lesson.contents.length"> 
    <h2>{{ lesson.contents }}</h2>
  </div>
  
</template>
 
<script>
import ContentList from "@/components/ContentList.vue";
import AddContent from "@/components/AddContent.vue";
import getDocument from "@/composables/getDocument";
import { ref } from "vue";
 
export default {
  props: ["id"],
  components: { AddContent },
  setup(props) {
    const { document: lesson } = getDocument("lessons", props.id);
 
    return { lesson };
  },
};
</script>
 
<style>
</style>

Тогда у меня такая ошибка:

Данные отображаются на экране, но с ошибкой на консоли (Firebase с Vue): не перехвачено (в обещании) TypeError: невозможно прочитать «содержимое» свойства, равное нулю

Что меня смущает, так это то, что я все еще могу отобразить урок. содержание на экране: Данные отображаются на экране, но с ошибкой на консоли (Firebase с Vue): не перехвачено (в обещании) TypeError: невозможно прочитать «содержимое» свойства, равное нулю

Я несколько часов пытался это исправить, но не мог понять, почему. Буду очень признателен за вашу помощь. Спасибо!

Мой код getDocument.js:

import { watchEffect, ref } from 'vue'
import { projectFirestore } from '../firebase/config'

const getDocument = (collection, id) => {

  let document = ref(null)
  let error = ref(null)

  // register the firestore collection reference
  let documentRef = projectFirestore.collection(collection).doc(id)

  const unsub = documentRef.onSnapshot(doc => {
    // need to make sure the doc exists & has data
    if (doc.data()) {
      document.value = {...doc.data(), id: doc.id}
      error.value = null
    }
    else {
      error.value = 'that document does not exist'
    }
  }, err => {
    console.info(err.message)
    error.value = 'problem fetching the document'
  })

  watchEffect((onInvalidate) => {
    onInvalidate(() => unsub())
  });

  return { error, document }

}

export default getDocument

Похоже, getDocument() должен вернуть начальный объект с contents, установленным в пустой массив. Прямо сейчас похоже, что изначально у него нет свойства contents

Phil 30.03.2021 05:15

Спасибо. Что бы вы посоветовали мне сделать, чтобы это исправить? Я проверил реквизиты с помощью отладчика Vue, и он показывает данные свойства contents. Вы можете посмотреть скриншот здесь: screencast.com/t/z7TQt1pM

Tam HN 30.03.2021 05:30

Включите в свой вопрос реализацию getDocument.

Phil 30.03.2021 05:31
Эта почта может помочь проиллюстрировать, что я имею в виду под "исходные данные"
Phil 30.03.2021 05:34

Я только что добавил свой код для getDocument.js. Не могли бы вы взглянуть, что я могу сделать, Фил? Спасибо!

Tam HN 30.03.2021 05:41
Поведение ключевого слова "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
5
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Эта строка ...

let document = ref(null)

инициализирует document в null. Только после выполнения обратного вызова onSnapshot он получает значение со свойством contents.

Чтобы ваше приложение не бросало ...

Cannot read property 'contents' of null

вы можете инициализировать document с лучшим значением по умолчанию

let document = ref({ contents: [] })

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