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

การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript

ใช้ React.ChangeEvent, React.MouseEvent และเจเนอริก RefObject สำหรับการโต้ตอบกับ DOM

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

เหตุการณ์สังเคราะห์ของ React

React ห่อเหตุการณ์ DOM ดั้งเดิมไว้ใน SyntheticEvent เหตุการณ์แต่ละชนิดมีเจเนริกเฉพาะของตนเอง เช่น React.ChangeEvent<HTMLInputElement>, React.MouseEvent<HTMLButtonElement> เป็นต้น

การกำหนดชนิดให้ onChange

เหตุการณ์ที่พบบ่อยที่สุดคือ onChange บนอินพุต ให้กำหนดชนิดตัวจัดการเหตุการณ์ด้วย React.ChangeEvent<HTMLInputElement>

function SearchInput() {
  const [value, setValue] = useState('');

  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setValue(e.target.value);
  };

  return <input value={value} onChange={handleChange} />;
}

การกำหนดชนิดให้ onClick

การคลิกปุ่มใช้ React.MouseEvent<HTMLButtonElement> คุณสามารถเข้าถึง e.currentTarget, e.preventDefault() และ e.stopPropagation() ได้โดยมีการกำหนดชนิดอย่างครบถ้วน

function DeleteButton({ onDelete }: { onDelete: () => void }) {
  const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
    e.stopPropagation();
    onDelete();
  };
  return <button onClick={handleClick}>Delete</button>;
}

การกำหนดชนิดให้ onSubmit

การส่งแบบฟอร์มใช้ React.FormEvent<HTMLFormElement> ให้เรียก e.preventDefault() เสมอเพื่อหยุดการนำทางเริ่มต้นของเบราว์เซอร์

function LoginForm() {
  const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault();
    const form = e.currentTarget;
    const email = (form.elements.namedItem('email') as HTMLInputElement).value;
    console.log(email);
  };
  return (
    <form onSubmit={handleSubmit}>
      <input name="email" />
      <button type="submit">Login</button>
    </form>
  );
}

การกำหนดชนิดให้เหตุการณ์แป้นพิมพ์

ใช้ React.KeyboardEvent<HTMLElement> เพื่อกำหนดชนิดให้ตัวจัดการแป้นพิมพ์ จากนั้นเข้าถึง e.key, e.code และ e.ctrlKey ได้อย่างปลอดภัย

function CommandInput() {
  const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
    if (e.key === 'Enter' && e.metaKey) {
      submitCommand();
    }
  };
  return <input onKeyDown={handleKeyDown} />;
}

useRef สำหรับองค์ประกอบ DOM

ส่งชนิดขององค์ประกอบ HTML เป็นเจเนริกให้กับ useRef และกำหนดค่าเริ่มต้นเป็น null จากนั้น TypeScript จะทราบว่ารีฟอ้างอิงเก็บองค์ประกอบชนิดนั้น

function AutoFocusInput() {
  const inputRef = useRef<HTMLInputElement>(null);

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

  return <input ref={inputRef} />;
}

รีฟแบบเปลี่ยนแปลงได้กับรีฟ DOM

เมื่อจัดเก็บค่าที่เปลี่ยนแปลงได้ซึ่งไม่ใช่โหนด DOM ให้กำหนดค่าเริ่มต้นของ useRef เป็นค่านั้นแทน null TypeScript จะอนุมานเป็น MutableRefObject ที่เปลี่ยนแปลงได้

// DOM ref (read-only current)
const divRef = useRef<HTMLDivElement>(null);

// Mutable ref (read-write current)
const countRef = useRef<number>(0);
countRef.current += 1; // ✓ no TypeScript error

การกำหนดชนิดให้ useImperativeHandle

เมื่อเปิดเผย API ของรีฟจากคอมโพเนนต์ลูก ให้กำหนดอินเทอร์เฟซสำหรับแฮนเดิล แล้วใช้แฮนเดิลนั้นทั้งใน forwardRef และ useImperativeHandle

interface DialogHandle {
  open: () => void;
  close: () => void;
}

const Dialog = forwardRef<DialogHandle, { title: string }>((props, ref) => {
  useImperativeHandle(ref, () => ({
    open: () => console.log('open'),
    close: () => console.log('close'),
  }));
  return <div>{props.title}</div>;
});

ฟังก์ชันเรียกกลับของรีฟ

ฟังก์ชันเรียกกลับของรีฟจะรับองค์ประกอบ DOM หรือ null ให้กำหนดชนิดเป็น (node: HTMLElement | null) => void

function MeasureDiv() {
  const [height, setHeight] = useState(0);

  const measuredRef = (node: HTMLDivElement | null) => {
    if (node) setHeight(node.getBoundingClientRect().height);
  };

  return <div ref={measuredRef}>Content: {height}px tall</div>;
}

เป้าหมายของเหตุการณ์กับเป้าหมายปัจจุบัน

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

const handleClick = (e: React.MouseEvent<HTMLUListElement>) => {
  const target = e.target as HTMLLIElement;
  console.log(target.dataset.id);
};

ชนิดตัวจัดการเหตุการณ์แบบเจเนริก

หากต้องการเขียนฟังก์ชันตัวจัดการเหตุการณ์ที่นำกลับมาใช้ใหม่ได้ ให้ใช้ React.EventHandler<Event> แบบเจเนริก หรือเขียนลายเซ็นฟังก์ชันแบบเต็มไว้โดยตรง

type InputChangeHandler = React.ChangeEventHandler<HTMLInputElement>;

const logChange: InputChangeHandler = (e) => {
  console.log(e.target.value); // e is fully typed
};

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

ควรใช้ชนิด TypeScript ใดกับ useRef ที่เก็บ HTMLInputElement

สรุปทบทวน

กำหนดชนิดตัวจัดการเหตุการณ์ด้วยเจเนริก React.ChangeEvent, React.MouseEvent และ React.FormEvent กำหนดชนิดรีฟ DOM ด้วย useRef<HTMLElement>(null) และกำหนดชนิดรีฟที่เปลี่ยนแปลงได้ด้วยชนิดของค่า ใช้ forwardRef พร้อมอินเทอร์เฟซแฮนเดิลที่ระบุอย่างชัดเจนสำหรับ API เชิงคำสั่ง

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

บทเรียน “การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript”

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

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

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

บทเรียน “การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การกำหนดชนิด Props และชนิดค่าที่คอมโพเนนต์คืนกลับ
  2. การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript
  3. คอมโพเนนต์แบบเจเนอริกและชนิดยูทิลิตี
  4. การกำหนดชนิด Context และ Custom Hooks
← กลับไปที่ React Academy