skip to Main Content

I am a beginner in react trying to fetch an object from firebase and I would like to initialise the useState with the data fetched from the database,but each time the data renders undefined value.Here is my truncated code

const ProductDetails = () => {
  const [tab, setTab] = useState("desc");
  const [products, setProducts] = useState([]);
  const reviewUser = useRef("");
  const reviewMsg = useRef("");
  const dispatch = useDispatch();
  const [rating, setRating] = useState(null);
  const { id } = useParams();
  const product = products.find(
    async (item) => (await item.key.slice(1)) === id
  );

const {
    image: imgUrl,
    title: productName,
    amount: price,
    description,
    shortDesc,
    category,
  } = product.data;

const fetchProducts = async () => {
    const db = getDatabase();
    const thumbnailRef = ref(db, "Contents/");

    onValue(thumbnailRef, (snapshot) => {
      snapshot.forEach((childSnapshot) => {
        const childData = childSnapshot.val();
        const childKey = childSnapshot.key;
        setProducts((prev) => [...prev, { key: childKey, data: childData }]);
      });
    });
  };

 useEffect(() => {
    fetchProducts();
  }, []);

the error I get is "cannot read properties of undefined (reading ‘data’)".As I said I am a beginner to react and it could be I am making an amateur mistake,

2

Answers


  1. First, you don’t have to use async/ await inside the find. Also wrap it around useMemo to execute only when products change.

      const product = useMemo(() => products.find(
         (item) =>  item.key === id
      ), [products]);
    

    secondly, product value could be ended up with undefined values. so needs to handle that.

    const {
        image: imgUrl,
        title: productName,
        amount: price,
        description,
        shortDesc,
        category,
      } = product?.data ||  { image: '',title: '',amount: '',description: '',shortDesc: '',category: '',};
    
    Login or Signup to reply.
  2. There should not be async await in product function

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search