ما المقصود بعمليات CRUD في React.js؟
CRUD هو اختصار لأربع عمليات أساسية تُستخدم في أغلب تطبيقات الويب:
- Create: إضافة بيانات جديدة.
- Read: قراءة وعرض البيانات.
- Update: تعديل بيانات موجودة.
- Delete: حذف بيانات.
في React.js يمكن تنفيذ هذه العمليات بسهولة باستخدام useState لإدارة البيانات،
وuseEffect لجلب البيانات، وfetch للتعامل مع API.
عرض المنتجات باستخدام Read
في صفحة ProductSidebar يتم جلب المنتجات من API عند تحميل الصفحة باستخدام useEffect:
useEffect(() => {
fetch("https://fakestoreapi.com/products")
.then(response => response.json())
.then(data => setProducts(data))
.catch(error => console.error("Error fetching products:", error));
}, []);
بعد جلب البيانات يتم عرضها داخل جدول باستخدام map:
{products.map(product => (
{product.title}
{product.description}
))}
ويُفضل أن تكون الحالة الابتدائية مصفوفة وليس كائنًا:
const [products, setProducts] = useState([]);
حذف منتج باستخدام Delete
لحذف منتج يتم إرسال طلب DELETE إلى API، وبعد نجاح العملية يتم تحديث الحالة
محليًا بحذف المنتج من القائمة:
const deleteItem = (product) => {
fetch(`https://fakestoreapi.com/products/${product.id}`, {
method: "DELETE"
})
.then(response => response.json())
.then(data => {
console.log("Product deleted successfully:", data);
setProducts(products.filter(p => [p.id](http://p.id/) !== [product.id](http://product.id/)));
})
.catch(error => console.error("Error deleting product:", error));
};
بهذا الشكل يتم حذف المنتج من الواجهة مباشرة دون الحاجة لإعادة تحميل الصفحة.
الانتقال إلى صفحة التعديل
عند الضغط على زر التعديل يتم استخدام useNavigate للانتقال إلى صفحة AddProduct مع تمرير بيانات المنتج عبر state:
const editItem = (product) => {
navigate("/add-product", { state: { product } });
};
ثم يتم استقبال البيانات في صفحة الإضافة أو التعديل باستخدام useLocation:
const location = useLocation();
const existingProduct = location.state?.product;
إضافة منتج جديد باستخدام Create
في صفحة AddProduct يتم استخدام نموذج لإدخال اسم المنتج والسعر، ثم إرسال
طلب POST عند الضغط على زر الإضافة:
fetch("https://fakestoreapi.com/products", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(product)
})
.then(response => response.json())
.then(data => {
console.log("Product added successfully:", data);
navigate("/");
});
هذه العملية تمثل جزء Create من CRUD.
تنفيذ التعديل باستخدام Update
الكود الحالي يرسل دائمًا طلب POST، حتى عند وجود منتج للتعديل. الأفضل هو
التحقق هل يوجد منتج قديم أم لا. إذا كان موجودًا نستخدم PUT أو PATCH، وإذا لم يكن موجودًا نستخدم POST.
const handleSubmit = (e) => {
e.preventDefault();
const url = existingProduct
? `https://fakestoreapi.com/products/${existingProduct.id}`
: "https://fakestoreapi.com/products";
const method = existingProduct ? "PUT" : "POST";
fetch(url, {
method,
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(product)
})
.then(response => response.json())
.then(data => {
console.log(existingProduct ? "Product updated:" : "Product added:", data);
navigate("/");
})
.catch(error => console.error("Error saving product:", error));
};
تحسين عنوان الصفحة والزر
لأن الصفحة تُستخدم للإضافة والتعديل معًا، يمكن تغيير العنوان والزر حسب الحالة:
ملاحظات مهمة على الكود
- يجب استخدام
useState([])بدلًا منuseState({})لأن المنتجات مصفوفة. - عملية العرض تمثل Read.
- زر الحذف يمثل Delete.
- صفحة الإضافة تمثل Create.
- تمرير المنتج إلى صفحة النموذج يساعد في تنفيذ Update.
- Fake Store API لا يحفظ التغييرات فعليًا في قاعدة بيانات، لكنه يرجع استجابة للتجربة فقط.
الخلاصة
تطبيق CRUD في React.js يعتمد على تقسيم العمليات بشكل واضح: جلب البيانات وعرضها،
إضافة عنصر جديد، تعديل عنصر موجود، وحذف عنصر من القائمة. باستخدام useState وuseEffect وfetch و react-router-dom يمكن بناء نظام بسيط وفعّال لإدارة المنتجات أو المنشورات.
هذا المثال يوضح فكرة عملية مهمة في React، وهي أن الصفحة الواحدة يمكن أن تُستخدم
لأكثر من غرض، مثل الإضافة والتعديل، بشرط التحقق من وجود بيانات مسبقة وتغيير نوع
الطلب بين POST وPUT.
لمزيد من المقالات : استخراج البيانات الشخصية بسهولة من الرقم القومي المصري باستخدام Flutter




