【发布时间】:2022-01-18 13:43:53
【问题描述】:
我正在从 firebase 获取数据,但结果未定义。当我注释掉使用数据的元素时,数据以状态存储,我取消注释元素并且它们呈现没有任何问题。当我进行更改并保存文件时,它会恢复为未定义并且元素不会呈现。
这是我目前正在使用的代码:
const router = useRouter();
const { make, model, id } = router.query;
const [singleCar, setSingleCar] = useState([]);
const docRef = doc(db, "car listings", `${id}`);
useEffect(() => {
const fetchDetails = async () => {
await getDoc(docRef).then((doc) => {
const carData = doc.data();
setSingleCar(carData);
});
await onSnapshot(docRef, (doc) => {
const carData = doc.data();
setSingleCar(carData);
});
};
fetchDetails();
}, [singleCar]);
我知道我既要获取一个文档又要添加一个实时侦听器,但我不确定哪个是最好的操作,因为 getDoc 方法在获取文档后只运行一次,所以我认为它可能会更好也有一个实时监听器。
这是我正在渲染的内容,我的想法是,如果状态未定义,则渲染 Loader 组件,直到状态随着适当的数据而改变。
{singleCar === [] ? (
<Loader />
) : (
<Container maxW="container.xl">
<Box display="flex" justifyContent="space-around">
<Image
w="500px"
src={singleCar.carImages[0].fileURL}
borderRadius="10px"
/>
{/* <CarImageGalleryModal isOpen={isOpen} onClose={onClose} /> */}
<Box
display="flex"
flexDirection="column"
justifyContent="space-between"
>
<SingleCarPrimary
make={singleCar.carDetails.make}
model={singleCar.carDetails.model}
year={singleCar.carDetails.year}
doors={singleCar.carDetails.doors}
engineSize={singleCar.carDetails.engine_size}
fuelType={singleCar.carDetails.fuel_type}
body={singleCar.carDetails.year}
price={singleCar.carPrice}
/>
<ContactSection />
</Box>
</Box>
<CarSummary carDetails={singleCar.carDetails} />
<SingleCarDescription carDescription={singleCar.carDescription} />
</Container>
)}
以下是信息在 Firebase 中的存储方式,让您了解正在检索的数据。
后端:Firebase 版本 9 前端:Next.js / Chakra UI
【问题讨论】: