Props & children; penangan peristiwa; refs
Definisikan props dan children bertipe; hubungkan penangan peristiwa dengan aman; buat dan gunakan refs untuk mengakses node DOM.
Props & children; penangan peristiwa; refs adalah pelajaran TypeScript Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar TypeScript Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus TypeScript Academy mencakup 3 pelajaran total.
Pendahuluan
Tujuan: Bangun komponen React bertipe: definisikan properti (dengan elemen anak), pasang penangan peristiwa dengan tipe yang tepat, dan fokuskan input menggunakan referensi.
- Antarmuka properti bertipe
- Tipe penangan peristiwa
- Referensi untuk akses DOM
Properti bertipe
Deklarasikan antarmuka properti; gunakan properti opsional dan persempit dengan literal union. Simpan nilai bawaan di dalam komponen.
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>
)
}Elemen anak
Gunakan PropsWithChildren<T> (atau React.PropsWithChildren) untuk menambahkan slot anak bertipe ke properti Anda.
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>
)
}Penangan peristiwa
Utamakan React.MouseEvent<Element> dan React.ChangeEvent<HTMLInputElement>. Keduanya menyediakan target/currentTarget bertipe.
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>
)
}Referensi: akses DOM
useRef<HTMLInputElement>(null) mempertahankan referensi yang dapat bernilai null; gunakan perangkaian opsional untuk mengakses node DOM dengan aman.
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>
)
}Meneruskan referensi
forwardRef memungkinkan komponen induk mengakses node DOM anak. Berikan tipe elemen untuk pengetikan yang tepat.
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" />
}Pemeriksaan pengetikan peristiwa
Pemeriksaan cepat: Apa tipe yang benar untuk penangan klik tombol?
Ringkasan
Ringkasan: Definisikan properti (dengan elemen anak), beri tipe yang tepat pada peristiwa, dan gunakan referensi (termasuk forwardRef) untuk mengakses node DOM dengan aman.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Props & children; penangan peristiwa; refs” gratis?
Ya — teks lengkap “Props & children; penangan peristiwa; refs” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus TypeScript Academy, upgrade ke CoddyKit PRO. Kursus TypeScript Academy mencakup 3 pelajaran total.
Apa yang akan aku pelajari di “Props & children; penangan peristiwa; refs”?
Definisikan props dan children bertipe; hubungkan penangan peristiwa dengan aman; buat dan gunakan refs untuk mengakses node DOM. Kamu berlatih TypeScript Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai TypeScript Academy?
Tidak diperlukan pengalaman sebelumnya. TypeScript Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 3.
Berapa lama pelajaran “Props & children; penangan peristiwa; refs” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran TypeScript Academy ini?
Ya. Setiap pelajaran TypeScript Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Props & children; penangan peristiwa; refs
- State & reducer; pengetikan Context
- Generik komponen — pengantar