React Academy · บทเรียน

การเลือกแถวและตารางเสมือน

เพิ่มการเลือกแถวด้วยช่องทำเครื่องหมาย และใช้ TanStack Table ร่วมกับ TanStack Virtual เพื่อเรนเดอร์ชุดข้อมูลขนาดใหญ่

บทเรียน 4 จาก 413 ขั้นตอน

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

เปิดใช้การเลือกแถว

เพิ่มคอลัมน์สำหรับการเลือกลงในอาร์เรย์ ColumnDef โดยใช้ id 'select' เซลล์จะแสดงช่องทำเครื่องหมายที่เชื่อมกับ row.getToggleSelectedHandler() ส่วนหัวจะแสดงช่องทำเครื่องหมายสำหรับเลือกทั้งหมดโดยใช้ table.getToggleAllRowsSelectedHandler()

นอกจากนี้ ให้ส่งสถานะ rowSelection และ onRowSelectionChange ไปยัง useReactTable

ตรวจสอบสถานะการเลือก

row.getIsSelected() ส่งคืนค่า true เมื่อแถวถูกเลือกอยู่ จึงเหมาะสำหรับใช้กำหนดรูปแบบพื้นหลังที่เน้นแถวที่เลือก

row.getIsSomeSelected() รองรับสถานะช่องทำเครื่องหมายแบบไม่แน่นอน เมื่อเลือกเพียงบางแถวในกลุ่ม (มีประโยชน์สำหรับตารางแบบจัดกลุ่ม)

ดึงแถวที่เลือก

table.getSelectedRowModel().rows ส่งคืนอาร์เรย์ของอ็อบเจ็กต์แถวทั้งหมดที่เลือกอยู่ในขณะนั้น แต่ละแถวมีพร็อพเพอร์ตี row.original ซึ่งมีอ็อบเจ็กต์ข้อมูลต้นฉบับ

นี่คือวิธีสร้างปุ่มสำหรับการดำเนินการกับหลายรายการที่ทำงานกับชุดข้อมูลที่เลือก เช่น "ลบรายการที่เลือก" หรือ "ส่งออกรายการที่เลือก"

รูปแบบส่วนติดต่อผู้ใช้สำหรับการดำเนินการแบบกลุ่ม

แสดงผลปุ่มการดำเนินการตามเงื่อนไขโดยอิงจาก table.getSelectedRowModel().rows.length > 0 เมื่อไม่มีแถวที่เลือก ให้ซ่อนหรือปิดใช้แถบเครื่องมือการดำเนินการแบบกลุ่ม เพื่อหลีกเลี่ยงการโต้ตอบกับสถานะว่างที่อาจทำให้สับสน

แสดงจำนวนรายการที่เลือกในส่วนติดต่อผู้ใช้: "เลือกแล้ว {count} แถว" เพื่อให้ผู้ใช้ทราบว่ากำลังเลือกอะไรอยู่

เหตุใดจึงต้องทำตารางให้เป็นเวอร์ชวล

การแสดงผล 10,000 แถวเป็นโหนด DOM จำนวนมากนั้นช้ามาก เบราว์เซอร์ต้องจัดวาง วาด และดูแลองค์ประกอบหลายพันรายการ ผู้ใช้จะพบกับการเลื่อนที่กระตุกและการแสดงผลครั้งแรกที่ช้า

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

ติดตั้ง TanStack Virtual

ติดตั้ง @tanstack/react-virtual พร้อมกับ @tanstack/react-table ไลบรารีทั้งสองแยกจากกัน แต่ได้รับการออกแบบให้ทำงานเสริมกัน TanStack Table จัดการตรรกะข้อมูล ส่วน TanStack Virtual จัดการว่ารายการใดจะแสดงผลใน DOM

จุดเชื่อมต่อระหว่างทั้งสองคืออาร์เรย์แถวจาก table.getRowModel().rows

ตั้งค่า useVirtualizer

เรียกใช้ useVirtualizer({ count: table.getRowModel().rows.length, getScrollElement: () => tableContainerRef.current, estimateSize: () => 35 }) ค่า count กำหนดจำนวนรายการเสมือนที่มีอยู่ให้ตรงกับจำนวนแถวปัจจุบันของตารางหลังใช้ตัวกรองทั้งหมด

estimateSize ให้ค่าประมาณความสูงแถวเริ่มต้น ส่วนความสูงจริงจะถูกวัดเมื่อแถวแสดงผล

แสดงผลรายการเสมือน

เรียกใช้ virtualizer.getVirtualItems() เพื่อรับเฉพาะแถวที่ควรอยู่ใน DOM ขณะนั้น วนดูอาร์เรย์นี้ เข้าถึงแถวจริงผ่าน table.getRowModel().rows[virtualRow.index] แล้วแสดงผลเฉพาะองค์ประกอบ tr เหล่านั้น

รายการเสมือนแต่ละรายการมีพร็อพเพอร์ตี start สำหรับจัดตำแหน่งแบบสัมบูรณ์ภายในตัวเลื่อน

เติมพื้นที่ด้วย div ตัวเว้นระยะ

เพื่อรักษาตำแหน่งการเลื่อนให้ถูกต้อง ให้เพิ่ม div ตัวเว้นระยะด้านบนที่มีความสูงเท่ากับ start ของรายการเสมือนรายการแรก และ div ตัวเว้นระยะด้านล่างที่มีความสูงเท่ากับขนาดทั้งหมดลบด้วย end ของรายการสุดท้าย

div ที่มองไม่เห็นเหล่านี้จะเติมพื้นที่ที่แถวซึ่งไม่ได้แสดงผลควรใช้ ทำให้สัดส่วนของแถบเลื่อนถูกต้อง

ความสูงแถวแบบไดนามิกด้วย measureElement

ส่ง measureElement: el => el.getBoundingClientRect().height ไปยัง useVirtualizer เพื่อวัดความสูงแถวแบบไดนามิกได้อย่างแม่นยำ โดยผูก ref ของแต่ละแถวเข้ากับองค์ประกอบ tr เพื่อให้ตัวทำเวอร์ชวลไลเซชันวัดความสูงจริงที่แสดงผล

วิธีนี้รองรับแถวที่มีเนื้อหาความสูงต่างกัน (ข้อความหลายบรรทัด แถวที่ขยายได้) โดยไม่ทำให้เค้าโครงเลื่อน

รวมฟีเจอร์ทั้งหมด

TanStack Table ที่มีการเรียงลำดับ การกรอง การแบ่งหน้า การเลือกแถว และ TanStack Virtual สามารถประกอบทำงานร่วมกันได้ทั้งหมด จำนวนแถวที่ส่งไปยัง useVirtualizer ควรมาจาก table.getRowModel().rows หลังโมเดลแถวที่กำลังใช้งานทั้งหมดประมวลผลข้อมูลแล้ว

เมื่อเปิดใช้การแบ่งหน้า ให้แบ่งหน้าก่อน แล้วจึงทำเวอร์ชวลไลเซชันกับแถวของหน้าปัจจุบัน เพื่อให้เลื่อนดูข้อมูลจำนวนมากในหน้าได้อย่างราบรื่น

การเลือกแถวของ TanStack Table

เมธอดใดส่งคืนอ็อบเจ็กต์ข้อมูลต้นฉบับสำหรับแถวทั้งหมดที่เลือกอยู่ในขณะนั้น

ทบทวนบทเรียน

การเลือกแถวใช้คอลัมน์ช่องทำเครื่องหมายร่วมกับ getToggleSelectedHandler สถานะ rowSelection และ table.getSelectedRowModel().rows เพื่อเข้าถึงข้อมูลที่เลือก การทำเวอร์ชวลไลเซชันด้วย useVirtualizer จะแสดงผลเฉพาะแถวที่มองเห็น โดยใช้ getVirtualItems, div ตัวเว้นระยะ และ measureElement ซึ่งเป็นตัวเลือกสำหรับความสูงแบบไดนามิก

ฟีเจอร์ทั้งหมดของ TanStack Table (การเรียงลำดับ การกรอง การแบ่งหน้า และการเลือก) ประกอบทำงานร่วมกับการแสดงผลแบบเวอร์ชวลได้อย่างราบรื่น

เริ่มต้นได้ฟรี

เรียนรู้ React ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
88
บทเรียน
324

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

บทเรียน “การเลือกแถวและตารางเสมือน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การเลือกแถวและตารางเสมือน”

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

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

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

บทเรียน “การเลือกแถวและตารางเสมือน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. แนวคิดของ TanStack Table และการออกแบบแบบไร้ส่วนติดต่อ
  2. การกำหนดคอลัมน์และการเรนเดอร์แถว
  3. การเรียงลำดับ การกรอง และการแบ่งหน้า
  4. การเลือกแถวและตารางเสมือน
← กลับไปที่ React Academy