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

DndContext, useDraggable และ useDroppable

เชื่อมต่อ Provider ของ DndContext และสร้างองค์ประกอบที่ลากได้กับวางได้ด้วยฮุกที่เกี่ยวข้อง

DndContext, useDraggable และ useDroppable เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

การห่อฟีเจอร์ของคุณด้วย DndContext

ฟีเจอร์การลากและวางทุกฟีเจอร์ใน dnd-kit ต้องห่อด้วยคอมโพเนนต์ DndContext DndContext เป็นศูนย์กลางการประสานงาน โดยติดตามการลากที่กำลังทำงาน สื่อสารระหว่างองค์ประกอบที่ลากได้กับองค์ประกอบที่วางได้ และเรียกกลับเหตุการณ์ โดยทั่วไปคุณจะวางคอมโพเนนต์นี้ไว้ในระดับของคอมโพเนนต์ที่จัดการสถานะการลาก

โครงสร้างของฮุก useDraggable

ฮุก useDraggable({ id }) ทำให้คอมโพเนนต์สามารถลากได้ ฮุกนี้ส่งคืนค่าหลักสี่รายการ ได้แก่ attributes (พร็อพ ARIA ที่นำไปกระจายบนองค์ประกอบ) listeners (ตัวจัดการเหตุการณ์สำหรับเริ่มการลาก) setNodeRef (เชื่อมต่อรีเฟอเรนซ์ขององค์ประกอบที่ลากได้) และ transform (การเลื่อนปัจจุบันในรูป {x, y, scaleX, scaleY})

การนำ useDraggable ไปใช้กับองค์ประกอบ

ในการเชื่อมต่อองค์ประกอบที่ลากได้ ให้นำ attributes และ listeners ไปกระจายบนองค์ประกอบ และส่ง setNodeRef เป็นพร็อพ ref attributes ประกอบด้วย role="button", tabIndex และพร็อพ aria ต่าง ๆ listeners จะเชื่อมต่อตัวจัดการเหตุการณ์ของตัวชี้และแป้นพิมพ์ที่ dnd-kit ต้องใช้เพื่อตรวจจับการเริ่มลาก

การนำสไตล์การแปลงไปใช้

ค่า transform จาก useDraggable จะเป็น null เมื่อไม่ได้ลาก และเป็นออบเจ็กต์พิกัดเมื่อกำลังลาก คุณจะแปลงค่านี้เป็นสตริง CSS โดยใช้ CSS.Translate.toString(transform) จากแพ็กเกจ @dnd-kit/utilities จากนั้นนำค่านี้ไปใช้เป็นคุณสมบัติ CSS transform บนองค์ประกอบที่ลากได้ เพื่อให้องค์ประกอบเคลื่อนตามเคอร์เซอร์บนหน้าจอ

โครงสร้างของฮุก useDroppable

ฮุก useDroppable({ id }) จะกำหนดให้คอนเทนเนอร์เป็นเป้าหมายที่วางได้ ฮุกนี้ส่งคืนค่า isOver (ค่าบูลีนที่เป็นจริงขณะที่องค์ประกอบที่ลากได้เลื่อนอยู่เหนือพื้นที่วางได้) และ setNodeRef สำหรับเชื่อมต่อรีเฟอเรนซ์กับองค์ประกอบที่วางได้ ต่างจาก useDraggable ตรงที่ไม่ต้องนำตัวฟังเหตุการณ์ใด ๆ ไปกระจาย

การตอบสนองทางภาพด้วย isOver

ค่า isOver จาก useDroppable ช่วยให้คุณแสดงการตอบสนองทางภาพระหว่างการลากได้ เมื่อ isOver เป็นจริง คุณสามารถใช้สีไฮไลต์ เส้นขอบ หรือการเปลี่ยนพื้นหลังกับพื้นที่วางได้ สิ่งนี้ช่วยให้ผู้ใช้เข้าใจว่าจะวางรายการได้ที่ใด ซึ่งสำคัญอย่างยิ่งต่อการใช้งานและการเข้าถึง

onDragEnd: การอ่านผลลัพธ์

การเรียกกลับ onDragEnd บน DndContext จะได้รับออบเจ็กต์เหตุการณ์ที่มีคุณสมบัติสำคัญสองรายการ ได้แก่ event.active ซึ่งมีรายการที่กำลังลาก (รวมถึง id ของรายการนั้น) และ event.over ซึ่งมีเป้าหมายที่วางได้ (หรือเป็นค่า null หากวางนอกองค์ประกอบที่วางได้ทั้งหมด) คุณจะใช้ ID เหล่านี้เพื่ออัปเดตสถานะของแอปพลิเคชัน

การอัปเดตสถานะหลังการวาง

ใน onDragEnd หลังจากตรวจสอบว่า event.over ไม่เป็นค่าว่างแล้ว ให้คุณอัปเดตสถานะเพื่อสะท้อนการย้าย ตัวอย่างเช่น หากกำลังย้ายการ์ดระหว่างคอลัมน์ในกระดานคัมบัง ให้ลบการ์ดออกจากคอลัมน์ต้นทางและเพิ่มลงในคอลัมน์เป้าหมายที่ระบุโดย event.over.id

DragOverlay สำหรับภาพตัวอย่างแบบลอย

DragOverlay แสดงภาพตัวอย่างแบบลอยของรายการที่กำลังลากและติดตามเคอร์เซอร์ โดยแสดงผลเป็นพอร์ทัล (อยู่นอกโครงสร้าง DOM ปกติ) จึงไม่ถูกตัดโดยคอนเทนเนอร์ที่ซ่อนเนื้อหาล้น แตกต่างจากองค์ประกอบต้นฉบับ โอเวอร์เลย์สามารถมีเงาตกกระทบ การแปลงมาตราส่วน หรือการหมุน เพื่อบ่งบอกว่ากำลังถูกลากอยู่

การติดตาม activeDragId สำหรับโอเวอร์เลย์

ในการแสดงผลเนื้อหาที่ถูกต้องใน DragOverlay ให้ติดตามว่ารายการใดกำลังถูกลากอยู่โดยใช้การเรียกกลับ onDragStart เก็บ ID ที่กำลังทำงานไว้ในสถานะ: setActiveDragId(event.active.id) ใน onDragEnd ให้รีเซ็ตเป็นค่าว่าง ภายใน DragOverlay ให้ใช้ activeDragId เพื่อค้นหารายการที่ถูกต้องแล้วแสดงผล

การใช้ส่วนที่ลากได้และจุดวางร่วมกัน

ส่วนติดต่อผู้ใช้สำหรับการลากและวางจริงจะรวม DndContext, องค์ประกอบ useDraggable หลายรายการ, โซน useDroppable หลายโซน และการจัดการสถานะเพื่อติดตามว่าแต่ละรายการอยู่ที่ใด แนวคิดสำคัญคือไลบรารีนี้มีกลไกการลากและวางให้ ส่วนหน้าที่ของคุณคืออัปเดตสถานะใน onDragEnd และแสดงผลส่วนติดต่อผู้ใช้ใหม่ให้สะท้อนการจัดวางใหม่

การใช้รูปแบบการแปลง

ยูทิลิตีใดแปลงออบเจ็กต์ transform จาก useDraggable ให้เป็นสตริงการแปลงของ CSS

ทบทวนบทเรียน: ฮุกหลัก

DndContext เป็นศูนย์กลางการประสานงานสำหรับการดำเนินการลากทั้งหมด useDraggable มอบแอตทริบิวต์ ตัวรับฟังเหตุการณ์ setNodeRef และการแปลงสำหรับองค์ประกอบที่ลากได้ useDroppable มอบ isOver และ setNodeRef สำหรับเป้าหมายการวาง onDragEnd มอบ event.active.id และ event.over?.id ให้คุณใช้อัปเดตสถานะ DragOverlay แสดงภาพตัวอย่างแบบลอยผ่านพอร์ทัล

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

บทเรียน “DndContext, useDraggable และ useDroppable” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “DndContext, useDraggable และ useDroppable”

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

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

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

บทเรียน “DndContext, useDraggable และ useDroppable” ใช้เวลานานแค่ไหน

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

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

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

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

  1. สถาปัตยกรรม dnd-kit และการออกแบบที่คำนึงถึงการช่วยการเข้าถึงเป็นหลัก
  2. DndContext, useDraggable และ useDroppable
  3. SortableContext สำหรับรายการที่จัดลำดับใหม่ได้
  4. โอเวอร์เลย์การลากกำหนดเองและ DnD หลายคอนเทนเนอร์
← กลับไปที่ React Academy