使用 React Js 在 Firebase 实时数据库中获取

Fetching in Firebase Realtime Database with React Js

我在使用 react js hook 在 firebase 实时数据库上获取数据时出错。当我用地图删除数据时,出现“未定义”错误,但我在控制台上看到日志数据是成功的。

我认为错误是因为循环代码在获取完成之前执行

这是获取代码

    const [firebaseDb, setFirebaseDb] = useState(database);
    const [data, setData] = useState([]);
    const [loading, setLoading] = useState(false);

    const getData = async () =>{
        try {
            const dbRef = firebaseDb;
            let snapshot = await get(child(dbRef, `menu`))
            if (snapshot.exists()) {
                console.log(snapshot.val());
                setData(snapshot.val());
                setLoading(false);
            } else {
                setData({});
                setLoading(false);
                console.log("No data available");
            }
        } catch(e){
            setLoading(false)
            console.log(e.message);
                        
        }        
        
    } 

    useEffect(() => {
        setLoading(true);
        getData()
    }, []);

这是循环代码

            {
                loading ? (
                    <Row><p>Loading ... !</p></Row>

                ) : (
                        <Row>
                            {
                                data.appetizer.map((apper, index) => {
                                    return (
                                        <Col key={index} lg='6' className="p-3">
                                            <div className="menu-list p-3">
                                                <h5>{apper.name}</h5>
                                                <h4>{apper.price}k</h4>
                                                <p className="mb-0">{apper.desc}</p>
                                            </div>
                                        </Col>
                                    )
                                })
                            }
                        </Row>
                    )

            }

您的 data 变量最初是一个数组,因此它没有 appetizer 属性。请改用 data.map(...)。 (尝试使用数组传递给 setData

当然渲染总是在获取完成之前执行。您只需要在渲染映射之前检查 typeof data.length > 0 ---- 或者只需将 loading 的初始值设置为 true.

应该是这样的:

const [loading, setLoading] = useState(true);

loading || data.length === 0 ? (
    <Row><p>Loading ... !</p></Row>
)