0Pricing
React Academy · บทเรียน

ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง

สร้างพื้นที่ลากและวางด้วยอีเวนต์ onDragOver/onDrop และการตอบสนองทางภาพ

ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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))}
/>

การแสดงตัวอย่างไฟล์

วนดูไฟล์ที่เลือกเพื่อแสดงชื่อและขนาด สำหรับไฟล์รูปภาพ ให้สร้าง URL ตัวอย่างด้วย URL.createObjectURL และเรียกคืน URL เหล่านั้นในเอฟเฟกต์ล้างข้อมูล

การนำไฟล์ออกก่อนอัปโหลด

อนุญาตให้ผู้ใช้นำไฟล์ออกก่อนอัปโหลดได้ด้วยการกรองอาร์เรย์ไฟล์ที่เลือก แล้วอัปเดตสถานะด้วยอาร์เรย์ที่ผ่านการกรองแล้ว
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

dragenter เทียบกับ dragover

ใช้ `dragenter` เพื่อตรวจจับเมื่อเริ่มลากเข้าสู่โซน และใช้ `dragover` เพื่อคงสถานะใช้งานไว้ขณะวางเมาส์เหนือโซน สำหรับองค์ประกอบลูกที่ซ้อนกัน ให้ใช้ตัวนับ โดยเพิ่มค่าเมื่อเกิด dragenter ลดค่าเมื่อเกิด dragleave และรีเซ็ตเมื่อเกิด drop

ไลบรารีจากผู้พัฒนาภายนอก

สำหรับโซนวางไฟล์ที่ใช้จริง ควรพิจารณา **ไลบรารีสำหรับโซนวางไฟล์** ซึ่งจัดการความแตกต่างของเบราว์เซอร์ แอตทริบิวต์ 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 เพื่อแสดงการตอบสนองทางภาพ และผสานกับช่องป้อนไฟล์ที่ซ่อนไว้เพื่อรองรับการเลือกไฟล์ด้วยการคลิก

บทเรียนถัดไป

บทเรียนถัดไป: **การอัปโหลดไฟล์ไปยังส่วนติดต่อโปรแกรมฝั่งเซิร์ฟเวอร์** — คุณจะใช้ FormData และฟังก์ชันดึงข้อมูลเพื่อ POST ไฟล์และติดตามความคืบหน้าการอัปโหลด

คำถามที่พบบ่อย

บทเรียน “ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง”

สร้างพื้นที่ลากและวางด้วยอีเวนต์ onDragOver/onDrop และการตอบสนองทางภาพ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อินพุตแบบไม่ควบคุมด้วย useRef
  2. อินพุตไฟล์และการอ่านข้อมูลไฟล์
  3. ส่วนติดต่อผู้ใช้อัปโหลดไฟล์แบบลากและวาง
  4. การอัปโหลดไฟล์ไปยังแบ็กเอนด์ API
← กลับไปที่ React Academy