Komponen Polimorfik dengan Prop 'as'
Tentukan tipe prop 'as' agar Button dirender sebagai atau sambil mempertahankan tipe prop yang benar.
Komponen Polimorfik dengan Prop 'as' adalah pelajaran React Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. 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 React Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus React Academy mencakup 4 pelajaran total.
Apa Itu Komponen Polimorfik
Komponen polimorfik dirender sebagai elemen HTML atau komponen yang berbeda berdasarkan properti as — misalnya, Button yang dirender sebagai <a> atau <button> sambil mempertahankan tipe TypeScript yang benar.
Properti as Sederhana (Tanpa TypeScript)
Implementasi polimorfik dasar tanpa generik — kehilangan keamanan tipe, tetapi menunjukkan konsepnya.
function Box({ as: Tag = 'div', children, ...props }) {
return <Tag {...props}>{children}</Tag>;
}
// Usage:
<Box as="section" className="hero">...</Box>
<Box as="article">...</Box>Properti as Bertipe dengan Generik
Tambahkan parameter tipe generik untuk menyimpulkan properti yang benar bagi elemen apa pun yang dirender oleh as.
type PolymorphicProps<E extends React.ElementType> = {
as?: E;
} & Omit<React.ComponentPropsWithoutRef<E>, 'as'>;
function Box<E extends React.ElementType = 'div'>({
as,
...props
}: PolymorphicProps<E>) {
const Tag = as ?? 'div';
return <Tag {...props} />;
}Dengan Dukungan ref
Tambahkan dukungan forwardRef sambil mempertahankan pengetikan polimorfik.
type PolymorphicRef<E extends React.ElementType> = React.ComponentPropsWithRef<E>['ref'];
type PolymorphicPropsWithRef<E extends React.ElementType, P = {}> = P &
Omit<React.ComponentPropsWithRef<E>, keyof P> & { as?: E };
const Button = React.forwardRef(
<E extends React.ElementType = 'button'>(
{ as, ...props }: PolymorphicPropsWithRef<E>,
ref: PolymorphicRef<E>
) => {
const Tag = as ?? 'button';
return <Tag ref={ref} {...props} />;
}
);Inferensi TypeScript dalam Praktik
Ketika Anda menetapkan as='a', TypeScript mengetahui bahwa komponen menerima properti khusus tautan seperti href dan target, tetapi tidak menerima properti khusus tombol seperti disabled.
// TypeScript allows href because as='a':
<Box as="a" href="https://example.com">Link</Box>
// TypeScript errors if you pass href to a div:
<Box as="div" href="...">Error!</Box> // TS: href is not a valid div propMemperluas dengan Properti Khusus
Tambahkan properti khusus komponen bersama basis polimorfik dengan menyebarkannya ke dalam definisi tipe.
type TextProps<E extends React.ElementType> = PolymorphicProps<E> & {
size?: 'sm' | 'md' | 'lg';
weight?: 'normal' | 'bold';
};
function Text<E extends React.ElementType = 'p'>({
as,
size = 'md',
weight = 'normal',
className,
...props
}: TextProps<E>) {
const Tag = as ?? 'p';
return (
<Tag
className={[`text-${size}`, `font-${weight}`, className].filter(Boolean).join(' ')}
{...props}
/>
);
}Kasus Penggunaan Nyata: Tautan yang Dirender sebagai RouterLink
Button yang dirender sebagai Link dari React Router ketika to diberikan, atau sebagai tombol biasa jika tidak diberikan.
import { Link } from 'react-router-dom';
type ButtonProps =
| { to: string; href?: never } & React.ComponentPropsWithoutRef<typeof Link>
| { href: string; to?: never } & React.ComponentPropsWithoutRef<'a'>
| { to?: never; href?: never } & React.ComponentPropsWithoutRef<'button'>;
function Button({ to, href, ...props }: ButtonProps) {
if (to) return <Link to={to} {...props} />;
if (href) return <a href={href} {...props} />;
return <button type="button" {...props} />;
}Komponen Teks Sistem Desain
Komponen polimorfik Text yang secara bawaan menggunakan <p>, tetapi dapat dirender sebagai h1–h6, span, atau label.
<Text as="h1" size="xl">Page Title</Text>
<Text as="span" weight="bold">Inline bold</Text>
<Text as="label" htmlFor="email">Email</Text> // htmlFor is valid because as='label'Batasan pada Properti as
Gunakan extends React.ElementType untuk menerima string elemen HTML ('div', 'a') dan komponen React.
function Card<E extends React.ElementType = 'div'>({ as, ...props }: PolymorphicProps<E>) {
const Tag = as ?? 'div';
return <Tag {...props} />;
}
// Works with HTML elements:
<Card as="section" aria-label="Products" />
// Works with React components:
<Card as={motion.div} animate={{ opacity: 1 }} />Menghindari Jebakan Umum
Jangan sebarkan properti as ke elemen tersebut (itu bukan atribut HTML yang valid). Selalu keluarkan properti itu melalui destrukturisasi sebelum menyebarkan properti lainnya.
// Bad:
function Box({ as: Tag = 'div', ...props }) {
return <Tag as={...} {...props} />; // 'as' attribute on div is invalid HTML
}
// Good:
function Box({ as: Tag = 'div', ...props }) {
return <Tag {...props} />; // 'as' is used to pick Tag, not passed to element
}Pertimbangan Kinerja
Komponen polimorfik memiliki beban kinerja tambahan yang minimal — properti as hanyalah variabel yang menyimpan string tipe elemen atau referensi komponen.
Pemeriksaan Singkat
Mengapa Anda harus mengeluarkan properti as melalui destrukturisasi sebelum menyebarkan properti lainnya ke elemen dalam komponen polimorfik?
Ringkasan
Komponen polimorfik menggunakan properti generik as?: E extends React.ElementType untuk merender elemen apa pun sambil mempertahankan properti TypeScript yang benar. Keluarkan as melalui destrukturisasi sebelum menyebarkan properti lainnya. Gunakan React.ComponentPropsWithoutRef untuk menyertakan semua atribut khusus elemen dalam tipe.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Komponen Polimorfik dengan Prop 'as'” gratis?
Ya — teks lengkap “Komponen Polimorfik dengan Prop 'as'” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus React Academy, upgrade ke CoddyKit PRO. Kursus React Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Komponen Polimorfik dengan Prop 'as'”?
Tentukan tipe prop 'as' agar Button dirender sebagai atau sambil mempertahankan tipe prop yang benar. Kamu berlatih React 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 React Academy?
Tidak diperlukan pengalaman sebelumnya. React 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 3 dari 4.
Berapa lama pelajaran “Komponen Polimorfik dengan Prop 'as'” 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 React Academy ini?
Ya. Setiap pelajaran React 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
- Union Diskriminatif untuk Varian Komponen
- Tipe Kondisional & Terpetakan dalam React
- Komponen Polimorfik dengan Prop 'as'
- Formulir Aman Tipe & Kontrak Respons API