0Pricing
React Academy · Ders

'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

  1. Bileşen Varyantları için Ayırt Edici Birleşimler
  2. React'te Koşullu ve Eşlenmiş Türler
  3. 'as' Prop'lu Polimorfik Bileşenler
  4. Tür Güvenli Formlar ve API Yanıt Sözleşmeleri
← React Academy Sayfasına Dön