JJourney AI

Bileşenler

CMS bileşen tiplerinin React bileşenlerine nasıl eşlendiği ve siteye yeni bir blok eklemenin adımları.

Son güncelleme: 7 Ekim 20263 dk okuma

Bu sayfada bileşen registry'sinin nasıl çalıştığını, eşleşmeyen bileşenlere ne olduğunu ve siteye yeni bir blok eklemeyi öğreneceksin.

Registry

Site şablonunda bir CMS bileşenini React bileşenine bağlayan tek yer COMPONENT_REGISTRY nesnesidir. src/components/cms/DynamicComponent.tsx içinde durur.

src/components/cms/DynamicComponent.tsx
const COMPONENT_REGISTRY = {
  "top-banner": () => Promise.resolve(null),
  custom: () => import("./CustomComponent"),
  "markdown-content": () => import("./MarkdownContent"),
  form: () => import("./FormContainer"),
} as const;

Her anahtar bir bileşen slug'ıdır. Her değer, bileşeni tembel yükleyen bir import() fonksiyonudur.

Eşleşme sırası

DynamicComponent önce düğümün slug alanına bakar. slug yoksa componentType değerinin küçük harfli hâlini kullanır. Anahtarlar küçük harfle karşılaştırılır.

DüğümKullanılan anahtar
{ "slug": "hero-banner", "componentType": "Custom" }hero-banner
{ "componentType": "Form" }form

Hazır bloklar

SlugNe yapar
markdown-contentMarkdown içeriği GFM ile bir prose bölümü olarak çizer.
formFormContainer: CMS form tanımından alanları üretir, doğrular, gönderir.
customHata ayıklama kartı. Bilinmeyen tiplerin yedeği.
top-bannerYer tutucu. Hiçbir şey çizmez.

Bileşene giden props

DynamicComponent düğümün tüm alanlarını props olarak geçirir: children, data, uniqueId, slug, title ve diğerleri. Ek olarak pageData gelir. pageData sayfa yanıtının kendisidir ve bir shareUrl alanı içerir. İhtiyacın olmayan alanları yok say.

Eşleşmeyen bileşenler

Yedek bileşen canlıda da görünür

Registry'de karşılığı olmayan bir slug CustomComponent'e düşer. Bu bileşen tüm alanları gösteren mavi bir hata ayıklama kartıdır ve canlı sitede de görünür. Canlıda kullanılan her bloğu registry'ye ekle.

Bileşenin import() çağrısı hata verirse yerine kırmızı bir Error loading component kutusu çizilir ve hata sunucu loguna yazılır.

Yeni bir blok eklemek

Sözleşmenin tamamı registry'ye bir satır ve src/components/cms/ altına bir dosyadır. Başka kayıt yeri yoktur.

Bileşeni panelde oluştur

Panelde bileşen kataloğunda yeni bir bileşen oluştur ve ona bir slug ver, örneğin hero-banner. Çocuklarını tanımla: title, description, image.

React bileşenini yaz

src/components/cms/HeroBanner.tsx dosyasını default export ile oluştur. Durum veya efekt gerekmiyorsa sunucu bileşeni olarak bırak.

src/components/cms/HeroBanner.tsx
import type { ApiComponent } from "@/types/cms";

interface HeroBannerProps {
  children?: ApiComponent[];
  pageData?: Record<string, unknown>;
  [key: string]: unknown; // kullanmadığın alanları yok say
}

const pick = (c: ApiComponent[] | undefined, slug: string) =>
  c?.find((x) => x.slug === slug)?.data as string | undefined;

export default function HeroBanner({ children }: HeroBannerProps) {
  const title = pick(children, "title");
  if (!title) return null; // eksik veri: hiçbir şey çizme

  const description = pick(children, "description");

  return (
    <section className="py-16">
      <h1 className="text-4xl font-bold">{title}</h1>
      {description && <p className="mt-4 text-muted-foreground">{description}</p>}
    </section>
  );
}

Registry'ye ekle

src/components/cms/DynamicComponent.tsx
const COMPONENT_REGISTRY = {
  // …
  "hero-banner": () => import("./HeroBanner"),
} as const;

Sayfaya yerleştir ve kontrol et

Panelde bileşeni bir sayfaya ekle ve önizleme sitesinde aç. Mavi hata ayıklama kartı yerine kendi bileşenini görmelisin.

Denetleyici desteği

Önizleme sitesinde panel, sayfadaki bir öğeye tıklayınca ilgili bileşeni seçebilir. DynamicComponent her üst düzey bloğu zaten işaretler. İç öğelerin de seçilebilmesini istiyorsan cmpAttrs sonucunu o öğeye yay:

src/components/cms/FeatureList.tsx
import { cmpAttrs } from "@/lib/inspector";

// …
<li key={item.uniqueId} {...cmpAttrs(item.uniqueId, item.slug)}>
  {/* … */}
</li>

cmpAttrs, NEXT_PUBLIC_INSPECTOR_ENABLED kapalıyken boş bir nesne döner. Canlı sitede hiçbir öznitelik eklenmez.

İpuçları

  • Her alan eksik olabilir. Bileşen kendi varsayılanlarını taşımalı.
  • Çocukları sırayla değil, slug ile bul.
  • Liste içinde key olarak uniqueId kullan, id değil.
  • "use client" yalnızca durum, efekt ya da tarayıcı API'si gerektiğinde ekle.

İlgili sayfalar

Bu sayfada