Web Accessibility Academy · บทเรียน

จัดการโฟกัสด้วย Refs และ useEffect

ควบคุมโฟกัสในโลกที่สร้างจากคอมโพเนนต์

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

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

เหตุใดจึงต้องจัดการ focus

เมื่อส่วนติดต่อผู้ใช้ปรากฏ หายไป หรืออัปเดต focus ของแป้นพิมพ์อาจไปอยู่ผิดตำแหน่งหรือหายไป ใน React คุณควบคุม focus ได้อย่างตั้งใจด้วย ref และ effect

ref ชี้ไปยังโหนด DOM

useRef ช่วยให้คุณมีตัวอ้างอิงที่คงที่ไปยังองค์ประกอบจริง หลังการแสดงผล ref.current คือโหนด DOM จริงที่คุณเรียก .focus() ได้

const inputRef = useRef(null);
<input ref={inputRef} />

useEffect ทำงานหลังการแสดงผล

ต้องย้าย focus หลังจากองค์ประกอบมีอยู่ใน DOM แล้ว useEffect ทำงานหลังเบราว์เซอร์วาดหน้าจอ จึงเป็นตำแหน่งที่ปลอดภัยสำหรับการย้าย focus

useEffect(() => {
  inputRef.current.focus();
}, []);

กำหนด focus เมื่อเมานต์

อาร์เรย์การขึ้นต่อกันที่ว่างเปล่าหมายความว่า effect จะทำงานครั้งเดียวเมื่อคอมโพเนนต์เมานต์ ใช้แนวทางนี้เพื่อกำหนด focus ไปยังช่องข้อมูลแรกของแบบฟอร์มหรือขั้นตอน

กำหนด focus เมื่อมีสิ่งเปิดขึ้น

เพิ่มการขึ้นต่อกัน เช่น isOpen เพื่อให้ effect ทำงานอีกครั้งเมื่อสถานะเปลี่ยน เมื่อแผงเปิดขึ้น คุณสามารถย้าย focus เข้าไปภายในได้โดยตรง

useEffect(() => {
  if (isOpen) panelRef.current.focus();
}, [isOpen]);

ป้องกันค่า null

ref อาจเป็น null หากยังไม่ได้แสดงโหนด ตรวจสอบว่ามี ref.current อยู่ก่อนเรียก .focus() เพื่อป้องกันแอปขัดข้องเมื่อไม่มีองค์ประกอบ

ref.current?.focus();

ทำให้องค์ประกอบที่ไม่ใช่ช่องข้อมูลรับ focus ได้

หัวข้อและ div ไม่สามารถรับ focus ได้ตามค่าเริ่มต้น เพิ่ม tabindex of -1 เพื่อให้สคริปต์กำหนด focus ไปยังองค์ประกอบเหล่านั้นได้ โดยไม่เพิ่มเข้าไปในลำดับ Tab ตามธรรมชาติ

<div tabindex="-1" ref={regionRef}>...</div>

คืน focus ระหว่างการล้างข้อมูล

effect สามารถคืนฟังก์ชันล้างข้อมูลได้ ใช้ฟังก์ชันนี้ส่ง focus กลับไปยังตัวกระตุ้นเมื่อเลเยอร์ถอดออก เพื่อไม่ให้ผู้ใช้ถูกพาไปยังด้านบนของหน้า

useEffect(() => {
  const prev = document.activeElement;
  return () => prev.focus();
}, []);

ระวังคลอสเชอร์ที่เก่า

effect จะเก็บค่าจากการแสดงผลของตัวเองไว้ หากคุณกำหนด focus โดยอิงจากข้อมูล ให้ใส่ข้อมูลนั้นใน dependency array เพื่อให้ effect ใช้ค่าปัจจุบัน ไม่ใช่ค่าเก่า

forwardRef สำหรับองค์ประกอบลูก

หากต้องการกำหนด focus ไปยังองค์ประกอบภายในคอมโพเนนต์ลูก ให้ครอบองค์ประกอบนั้นด้วย forwardRef จากนั้นคอมโพเนนต์แม่จะถือ ref ที่ชี้ไปยังโหนดภายในและกำหนด focus ได้

const Field = forwardRef((props, ref) =>
  <input ref={ref} {...props} />);

อย่ากำหนด focus มากเกินไป

ย้าย focus เฉพาะเมื่อช่วยผู้ใช้ได้จริง เช่น เมื่อเปิดกล่องโต้ตอบหรือแสดงข้อผิดพลาด การแย่ง focus ในทุกครั้งที่แสดงผลทำให้ทุกคนหงุดหงิด

ตรวจสอบอย่างรวดเร็ว

คุณต้องการย้าย focus ของแป้นพิมพ์ไปยังองค์ประกอบทันทีหลังจาก React แสดงผล ควรใส่การทำงานนี้ไว้ที่ใด

สรุป: ref ร่วมกับ effect

จับคู่ useRef กับ useEffect เพื่อย้าย focus หลังการแสดงผล ป้องกันค่า null คืน focus ระหว่างการล้างข้อมูล และควบคุม focus เฉพาะเมื่อช่วยผู้ใช้ได้ 🎯

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

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

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

คอร์ส
30
บทเรียน
120

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

บทเรียน “จัดการโฟกัสด้วย Refs และ useEffect” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “จัดการโฟกัสด้วย Refs และ useEffect”

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

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

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

บทเรียน “จัดการโฟกัสด้วย Refs และ useEffect” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เปลี่ยนเส้นทางโดยไม่โหลดหน้าใหม่
  2. จัดการโฟกัสด้วย Refs และ useEffect
  3. แฟรกเมนต์ พอร์ทัล และกับดักลำดับ DOM
  4. jsx-a11y และแนวป้องกันระดับคอมโพเนนต์
← กลับไปที่ Web Accessibility Academy