0Pricing
React Academy · درس

واجهة تحميل الملفات بالسحب والإفلات

أنشئوا منطقة للسحب والإفلات باستخدام أحداث onDragOver/onDrop والتغذية الراجعة المرئية

واجهة تحميل الملفات بالسحب والإفلات درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

مرحبًا

في هذا الدرس، ستبنون منطقة لرفع الملفات بالسحب والإفلات في React باستخدام أحداث السحب الأصلية ومؤشرات مرئية لإرشاد المستخدمين.

نظرة عامة على أحداث السحب

يطلق المتصفح أحداث السحب عند سحب الملفات فوق العناصر. الأحداث الأساسية هي: `dragover` (يكون الملف فوق العنصر)، و`dragleave` (يترك الملف العنصر)، و`drop` (يُفلت الملف).

منع السلوك الافتراضي

بشكل افتراضي، يؤدي إفلات ملف في المتصفح إلى الانتقال إليه. استدعوا `e.preventDefault()` في كل من `onDragOver` و`onDrop` لمنع ذلك.
const handleDragOver = (e) => {
  e.preventDefault();
};
const handleDrop = (e) => {
  e.preventDefault();
  const files = Array.from(e.dataTransfer.files);
  // process files
};

الحالة المرئية النشطة

تتبّعوا ما إذا كان ملف يُسحب فوق المنطقة باستخدام حالة منطقية. بدّلوا فئة CSS لتوفير مؤشرات مرئية للمستخدمين، مثل إبراز الحدود.
const [isDragging, setIsDragging] = useState(false);

<div
  className={isDragging ? 'zone active' : 'zone'}
  onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
  onDragLeave={() => setIsDragging(false)}
  onDrop={handleDrop}
>

قراءة الملفات المُفلتة

توجد الملفات المُفلتة في `e.dataTransfer.files` — وهي قائمة FileList. حوّلوها إلى مصفوفة ثم عالجوا الملفات.
const handleDrop = (e) => {
  e.preventDefault();
  setIsDragging(false);
  const files = Array.from(e.dataTransfer.files);
  setSelectedFiles(files);
};

دمج النقر للتصفح

اجعلوا منطقة الإفلات قابلة للنقر أيضًا، وذلك بعرض حقل إدخال ملفات مخفي والنقر عليه برمجيًا عند النقر فوق المنطقة.
const inputRef = useRef();

<div onClick={() => inputRef.current.click()} ...>
  Drop files here or click to browse
</div>
<input
  ref={inputRef}
  type="file"
  multiple
  hidden
  onChange={(e) => setSelectedFiles(Array.from(e.target.files))}
/>

عرض معاينات الملفات

استخدموا map على الملفات المحددة لعرض أسمائها وأحجامها. وبالنسبة إلى ملفات الصور، أنشئوا عناوين URL للمعاينة باستخدام URL.createObjectURL وألغوا صلاحيتها داخل تأثير تنظيف.

إزالة الملفات قبل الرفع

اسمحوا للمستخدمين بإزالة الملفات قبل رفعها عبر تصفية مصفوفة الملفات المحددة. حدّثوا الحالة بالمصفوفة الناتجة عن التصفية.
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

dragenter مقابل dragover

استخدموا `dragenter` لاكتشاف دخول السحب إلى المنطقة للمرة الأولى، و`dragover` للحفاظ على الحالة النشطة أثناء التحويم. استخدموا عدادًا للعناصر الفرعية المتداخلة: زيدوه عند `dragenter`، وأنقصوه عند `dragleave`، وأعيدوا ضبطه عند `drop`.

المكتبات التابعة لجهات خارجية

بالنسبة إلى مناطق الإفلات المخصصة لبيئة الإنتاج، ضعوا **react-dropzone** في الاعتبار؛ فهي تتعامل تلقائيًا مع اختلافات المتصفحات، وسمات ARIA، وتصفية أنواع الملفات، وأنماط الرفع المتعددة.
import { useDropzone } from 'react-dropzone';
const { getRootProps, getInputProps, isDragActive } = useDropzone({
  onDrop: acceptedFiles => setFiles(acceptedFiles),
  accept: { 'image/*': [] },
});

تحقق سريع

لماذا يجب استدعاء e.preventDefault() في معالج onDragOver؟

مراجعة

أنشئوا منطقة إفلات باستخدام أحداث onDragOver وonDragLeave وonDrop. استدعوا دائمًا e.preventDefault() عند السحب والإفلات. تتبّعوا حالة isDragging لتوفير مؤشرات مرئية. ادمجوا ذلك مع حقل إدخال ملفات مخفي لإتاحة النقر للتصفح.

التالي

الدرس التالي: **رفع الملفات إلى واجهة API خلفية** — ستستخدمون FormData وfetch لإرسال الملفات باستخدام POST وتتبع تقدم الرفع.

الأسئلة الشائعة

هل درس «واجهة تحميل الملفات بالسحب والإفلات» مجاني؟

نعم — نص درس «واجهة تحميل الملفات بالسحب والإفلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «واجهة تحميل الملفات بالسحب والإفلات»؟

أنشئوا منطقة للسحب والإفلات باستخدام أحداث onDragOver/onDrop والتغذية الراجعة المرئية تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «واجهة تحميل الملفات بالسحب والإفلات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. المدخلات غير المتحكَّم بها باستخدام useRef
  2. إدخال الملفات وقراءة بياناتها
  3. واجهة تحميل الملفات بالسحب والإفلات
  4. رفع الملفات إلى واجهة برمجة خلفية
← العودة إلى React Academy