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

พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ

กำหนดพร็อพและลูกที่มีชนิดข้อมูล เชื่อมตัวจัดการเหตุการณ์อย่างปลอดภัย และสร้างกับใช้รีฟเพื่อเข้าถึงโหนด 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. พร็อพและลูก อีเวนต์แฮนด์เลอร์ และรีฟ
  2. สถานะและตัวลด; การกำหนดชนิดข้อมูล Context
  3. เจเนอริกของคอมโพเนนต์ — เบื้องต้น
← กลับไปที่ TypeScript Academy