พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ
กำหนดพร็อพและลูกที่มีชนิดข้อมูล เชื่อมตัวจัดการเหตุการณ์อย่างปลอดภัย และสร้างกับใช้รีฟเพื่อเข้าถึงโหนด DOM
พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ เป็นบทเรียน TypeScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน TypeScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
บทนำ
เป้าหมาย: สร้างคอมโพเนนต์ React ที่มีการระบุชนิด โดยกำหนดพร็อพส์พร้อมองค์ประกอบลูก ผูกตัวจัดการเหตุการณ์ด้วยชนิดที่แม่นยำ และโฟกัสอินพุตโดยใช้รีฟ
- อินเทอร์เฟซพร็อพส์ที่ระบุชนิด
- ชนิดของตัวจัดการเหตุการณ์
- รีฟสำหรับเข้าถึง DOM
พร็อพส์ที่ระบุชนิด
ประกาศอินเทอร์เฟซของพร็อพส์ ใช้พร็อพส์เสริมและจำกัดค่าให้แคบลงด้วยลิเทอรัลแบบยูเนียน เก็บค่าเริ่มต้นไว้ภายในคอมโพเนนต์
import React from "react"
interface BadgeProps {
text: string
color?: "primary" | "success" | "warning"
}
export function Badge({ text, color = "primary" }: BadgeProps) {
const bg = color === "success" ? "#16a34a" : color === "warning" ? "#d97706" : "#2563eb"
return <span style={{ backgroundColor: bg, color: "white", padding: 4, borderRadius: 6 }}>{text}</span>
}
export default function App() {
return (
<div style={{ display: "grid", gap: 8 }}>
<Badge text="Saved" color="success" />
<Badge text="Warn" color="warning" />
</div>
)
}องค์ประกอบลูก
ใช้ PropsWithChildren<T> (หรือ React.PropsWithChildren) เพื่อเพิ่มช่ององค์ประกอบลูกที่ระบุชนิดให้กับพร็อพส์
import React, { PropsWithChildren } from "react"
type CardProps = PropsWithChildren<{ title: string }>
function Card({ title, children }: CardProps) {
return (
<div style={{ border: "1px solid #e5e7eb", padding: 12, borderRadius: 8 }}>
<h3 style={{ margin: 0 }}>{title}</h3>
<div>{children}</div>
</div>
)
}
export default function App() {
return (
<Card title="Dashboard">
<p>Children are typed automatically.</p>
</Card>
)
}ตัวจัดการเหตุการณ์
ควรเลือกใช้ React.MouseEvent<Element> และ React.ChangeEvent<HTMLInputElement> ซึ่งมี target/currentTarget ที่ระบุชนิด
import React from "react"
export default function App() {
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
console.log("clicked", e.currentTarget.name)
}
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
console.log("value", e.target.value)
}
return (
<div style={{ display: "grid", gap: 8 }}>
<input name="n" onChange={handleChange} placeholder="Type here" />
<button name="ok" onClick={handleClick}>Confirm</button>
</div>
)
}รีฟ: การเข้าถึง DOM
useRef<HTMLInputElement>(null) ช่วยคงรีฟที่อาจเป็นค่าว่างไว้ ใช้การเชื่อมโยงแบบเลือกได้เพื่อเข้าถึงโหนด DOM อย่างปลอดภัย
import React, { useRef } from "react"
export default function App() {
const inputRef = useRef<HTMLInputElement>(null)
const focusInput = () => {
inputRef.current?.focus()
}
return (
<div style={{ display: "grid", gap: 8 }}>
<input ref={inputRef} placeholder="Focus me" />
<button onClick={focusInput}>Focus</button>
</div>
)
}การส่งต่อรีฟ
forwardRef ช่วยให้คอมโพเนนต์แม่เข้าถึงโหนด DOM ของคอมโพเนนต์ลูกได้ โปรดระบุชนิดขององค์ประกอบเพื่อให้การระบุชนิดแม่นยำ
import React, { forwardRef } from "react"
type TextInputProps = { label: string }
const TextInput = forwardRef<HTMLInputElement, TextInputProps>(function TextInput({ label }, ref) {
return (
<label style={{ display: "grid", gap: 4 }}>
<span>{label}</span>
<input ref={ref} />
</label>
)
})
export default function App() {
const setRef = (el: HTMLInputElement | null) => { if (el) el.focus() }
return <TextInput ref={setRef} label="Auto focus" />
}ตรวจสอบการระบุชนิดเหตุการณ์
ตรวจสอบอย่างรวดเร็ว: ชนิดใดเป็นชนิดที่ถูกต้องสำหรับตัวจัดการการคลิกปุ่ม
สรุปทบทวน
สรุปทบทวน: กำหนดพร็อพส์พร้อมองค์ประกอบลูก ระบุชนิดเหตุการณ์ให้แม่นยำ และใช้รีฟ รวมถึง forwardRef เพื่อเข้าถึงโหนด DOM อย่างปลอดภัย
คำถามที่พบบ่อย
บทเรียน “พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส TypeScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส TypeScript Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ”
กำหนดพร็อพและลูกที่มีชนิดข้อมูล เชื่อมตัวจัดการเหตุการณ์อย่างปลอดภัย และสร้างกับใช้รีฟเพื่อเข้าถึงโหนด DOM คุณปฏิบัติ TypeScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน TypeScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน TypeScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน
บทเรียน “พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน TypeScript Academy นี้ได้ไหม
ได้ บทเรียน TypeScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ
- สถานะและตัวลด; การกำหนดชนิดข้อมูล Context
- เจเนอริกของคอมโพเนนต์ — เบื้องต้น