การกำหนดชนิดอีเวนต์และ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดชนิด Props และชนิดค่าที่คอมโพเนนต์คืนกลับ
- การกำหนดชนิดอีเวนต์และ Refs ใน TypeScript
- คอมโพเนนต์แบบเจเนอริกและชนิดยูทิลิตี
- การกำหนดชนิด Context และ Custom Hooks