Странное поведение состояния внутри.затем блок

#javascript #reactjs #firebase #google-cloud-firestore

#javascript #reactjs #firebase #google-облако-firestore

Вопрос:

Я извлекаю данные из коллекции firebase cafes в вызываемый компонент React CafeReviews , а затем устанавливаю эти данные в вызываемую переменную состояния cafe . Возвращаемые данные имеют следующую форму:

 {
 name: cafe name,
 photoURL: photo url
}
 

Странное поведение заключается в том, что иногда данные отображаются в браузере, но в других случаях браузер выходит из строя и выдает следующую ошибку:

TypeError: cafe.data() is not a function

Я предполагаю, что это асинхронная ошибка — браузер загружает компонент до того, как состояние было установлено. Итак, как мне установить состояние внутри .then блока, который сам находится внутри useEffect перехвата?

Вот компонент полностью:

 import React, { useState,useEffect } from 'react'
import db from '../fbConfig'

const CafeReviews = ({match}) => {

    const [cafe,setCafe] = useState([])
    let id = match.params.id

 useEffect(() => {
        db.collection('cafes')
        .doc(id)
        .get()
        .then(snapshot => {
          setCafe(snapshot)
        })
    },[])

    return(
        <div>
           <h1>{cafe.data().name}</h1> 
        </div>
    )
}

export default CafeReviews
 

Комментарии:

1. Почему вы ожидаете cafe. данные должны быть функцией? Когда этот метод определен?

2. Вы хотите отобразить список кафе или одно кафе в этом компоненте?

Ответ №1:

Ваше начальное состояние для cafe is [] , поэтому, когда вы вызываете cafe.data() это, оно выдает ошибку, которую вы получаете. Вам нужно убедиться, что ваш код рендеринга обрабатывает как начальное состояние, так и данные из базы данных, обычно обеспечивая их одинаковую форму.

Например:

 const [cafe,setCafe] = useState({ name: "loading..." })