返回

来自Firebase的reactjs-React-上下文API和promise

发布时间:2022-07-03 09:52:37 389
# css

首先我想说a)我是新手,b)我花了大约8小时试图在stackoverflow中挖掘修复,尝试了许多不同的方法。我被困住了。非常感谢您的时间。

这里的目标是在渲染页面之前等待来自 firebase 的请求以创建值“产品”。不断发生的事情是产品被加载为空。

这是我的设置:

ProductContext.js

import React, {createContext, useState, useEffect} from 'react';
import { dummyProducts } from '../services/dummy';
import {collection, onSnapshot} from "firebase/firestore";
import {db} from "../firebase";

export const ProductsContext = createContext();

export function getProductData() {
    const myArray =[];
    return new Promise(function (resolve, reject) {
        const querySnapshot = onSnapshot(collection(db, 'products'), (snapshot) => {
            snapshot.forEach(doc => {
                let productData = doc.data();
                myArray.push(productData)
            })
        })
        resolve(myArray);
    });
}

const ProductsContextProvider = ({children}) => {

    const [products, setProducts] = useState([]);
    const [isLoading, setIsLoading] = useState(true);

    useEffect(() => {
        let didCancel = false;
        async function fetchMyAPI() {
            let results = await getProductData();
            console.log(results) // Outputs array with results
            setProducts(results)
        }
        fetchMyAPI();
        return () => { didCancel = true; }; // Remember if we start fetching something else
    }, []);

    return (
        
            { children }
        
    );
}

export default ProductsContextProvider;

使用Products.js

// eslint-disable-next-line
import React, { useContext } from 'react';
import { ProductsContext } from '../contexts/ProductsContext';

export const useProducts = () => {

    const ctx = useContext(ProductsContext)

    return {
        ...ctx
    }
}

ProductsGrid.js

import React from 'react';
import ProductItem from './ProductItem';
import styles from './ProductsGrid.module.scss';
import { useProducts } from '../../hooks/useProducts';

const ProductsGrid = () => {

    const {products} = useProducts();
    console.log(products.length) // Outputs zero
    console.log(products) // Outputs array with 1 object (correct)

    return (
{products.length} Products
 
{ products.map(product => ( )) }
 

     );
}
 
export default ProductsGrid;

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Routes from './routes';
import * as serviceWorker from './serviceWorker';

import { HelmetProvider } from 'react-helmet-async';
import ProductsContextProvider from './contexts/ProductsContext';
import CartContextProvider from './contexts/CartContext';

ReactDOM.render(
    <HelmetProvider>
      <ProductsContextProvider>
        <CartContextProvider>
          <Routes />
        </CartContextProvider>
      </ProductsContextProvider>
    </HelmetProvider>,
  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
serviceWorker.unregister();
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像