import { useEffect, useState } from "react";
import Product from "./Product";
function AllProducts() {
const [posts, setPosts] = useState([]);
const fetchData = async () => {
await fetch("https://dummyjson.com/products")
.then((res) => res.json())
.then((data) => {
console.log(data.products);
setPosts(data.products);
});
};
useEffect(() => {
fetchData();
}, []);
return (
<div>
{posts.length ? <Product posts={posts} /> : "جاري التحميل"}
</div>
);
}
export default AllProducts;JSXالشرح المبسّط
useState([]): نجهّز حالة اسمهاposts(مصفوفة) علشان نخزّن فيها المنتجات.fetchData: دالة بتجيب البيانات من الرابط:fetch(...)→ يطلب البيانات..then(res => res.json())→ يحوّل الردّ إلى JSON..then(data => setPosts(data.products))→ نحفظ مصفوفة المنتجات داخلposts.
useEffect(() => { fetchData(); }, []): نستدعيfetchDataمرة واحدة بعد أول رندر (عشان [] فاضية).- في الـ return:
- لو
posts.lengthأكبر من صفر → نعرض كومبوننتProductونعطيهpostsكـ prop. - لو لسه فاضي → نعرض نص بسيط: “جاري التحميل”.
- لو
ملاحظة: داخل
Productتأكد تستقبل الـ prop كذا:
function Product({ posts }) { /* ... */ }JSXوعند عرض العناصر استخدم key مثل product.id داخل الـ map.