'as' Prop'lu Polimorfik Bileşenler
Doğru prop türlerini koruyarak Button'ın veya olarak oluşturulabilmesi için 'as' prop'unu türlendirin.
'as' Prop'lu Polimorfik Bileşenler, CoddyKit'te ücretsiz bir React Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, React Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. React Academy kursu toplamda 4 dersten oluşur.
Polimorfik Bileşen Nedir?
Polimorfik bir bileşen, bir as özelliğine göre farklı HTML öğeleri veya bileşenleri olarak oluşturulur — örneğin doğru TypeScript türlerini korurken <a> veya <button> olarak oluşturulabilen bir Button.
Basit as Özelliği (TypeScript Olmadan)
Jenerikler olmadan temel bir polimorfik uygulama — tür güvenliğini kaybeder, ancak kavramı gösterir.
function Box({ as: Tag = 'div', children, ...props }) {
return <Tag {...props}>{children}</Tag>;
}
// Usage:
<Box as="section" className="hero">...</Box>
<Box as="article">...</Box>Jeneriklerle Tür Denetimli as Özelliği
as özelliğinin oluşturduğu herhangi bir öğe için doğru özelliklerin çıkarılması amacıyla bir jenerik tür parametresi ekleyin.
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} />;
}ref Desteğiyle
Polimorfik tür bilgilerini korurken forwardRef desteği ekleyin.
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} />;
}
);Uygulamada TypeScript Çıkarımı
as='a' ayarladığınızda TypeScript, bileşenin href ve target gibi bağlantıya özgü özellikleri kabul ettiğini, ancak disabled gibi düğmeye özgü özellikleri kabul etmediğini bilir.
// 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 propÖzel Özelliklerle Genişletme
Bileşene özgü özellikleri tür tanımına yayarak polimorfik temel özelliklerin yanına ekleyin.
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}
/>
);
}Gerçek Dünya Kullanım Örneği: RouterLink Olarak Oluşturulan Bağlantı
to sağlandığında React Router'ın Link'i olarak, aksi takdirde düz bir düğme olarak oluşturulan bir Button.
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} />;
}Tasarım Sistemi Metin Bileşeni
Varsayılan olarak <p> olan, ancak h1–h6, span veya label olarak oluşturulabilen polimorfik bir Text bileşeni.
<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'as Özelliğine Getirilen Kısıtlamalar
Hem HTML öğesi dizelerini ('div', 'a') hem de React bileşenlerini kabul etmek için extends React.ElementType kullanın.
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 }} />Yaygın Tuzaklardan Kaçınma
as özelliğini öğeye yaymayın (geçerli bir HTML özniteliği değildir). Kalan özellikleri yaymadan önce her zaman bu özelliği ayrıştırarak çıkarın.
// 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
}Performansla İlgili Husus
Polimorfik bileşenlerin performans yükü minimumdur — as özelliği yalnızca bir öğe türü dizesini veya bileşen başvurusunu tutan bir değişkendir.
Kısa Kontrol
Polimorfik bir bileşende kalan özellikleri öğeye yaymadan önce as özelliğini neden ayrıştırarak çıkarmalısınız?
Özet
Polimorfik bileşenler, doğru TypeScript özelliklerini koruyarak herhangi bir öğe olarak oluşturulmak için genel bir as?: E extends React.ElementType özelliği kullanır. Kalan özellikleri yaymadan önce as özelliğini ayrıştırarak çıkarın. Türde öğeye özgü tüm öznitelikleri içermek için React.ComponentPropsWithoutRef kullanın.
Sıkça Sorulan Sorular
“'as' Prop'lu Polimorfik Bileşenler” dersi ücretsiz mi?
Evet — “'as' Prop'lu Polimorfik Bileşenler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve React Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. React Academy kursu toplamda 4 dersten oluşur.
“'as' Prop'lu Polimorfik Bileşenler” dersinde ne öğreneceğim?
Doğru prop türlerini koruyarak Button'ın veya olarak oluşturulabilmesi için 'as' prop'unu türlendirin. React Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
React Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te React Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“'as' Prop'lu Polimorfik Bileşenler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu React Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her React Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Bileşen Varyantları için Ayırt Edici Birleşimler
- React'te Koşullu ve Eşlenmiş Türler
- 'as' Prop'lu Polimorfik Bileşenler
- Tür Güvenli Formlar ve API Yanıt Sözleşmeleri