Bileşenler
CMS bileşen tiplerinin React bileşenlerine nasıl eşlendiği ve siteye yeni bir blok eklemenin adımları.
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.
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üğüm | Kullanılan anahtar |
|---|---|
{ "slug": "hero-banner", "componentType": "Custom" } | hero-banner |
{ "componentType": "Form" } | form |
Hazır bloklar
| Slug | Ne yapar |
|---|---|
markdown-content | Markdown içeriği GFM ile bir prose bölümü olarak çizer. |
form | FormContainer: CMS form tanımından alanları üretir, doğrular, gönderir. |
custom | Hata ayıklama kartı. Bilinmeyen tiplerin yedeği. |
top-banner | Yer 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.
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
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:
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,
slugile bul. - Liste içinde
keyolarakuniqueIdkullan,iddeğil. "use client"yalnızca durum, efekt ya da tarayıcı API'si gerektiğinde ekle.
İlgili sayfalar
Geliştirici dokümantasyonu
Journey AI ile site geliştirme ve teknik entegrasyon rehberleri.
Kurulum
API, yönetim paneli ve site şablonunu yerelde kurma, ayarlama ve birbirine bağlama.
Mimari
Yönetim paneli, API ve sitelerin birbiriyle nasıl konuştuğunu ve bir değişikliğin canlıya nasıl ulaştığını öğrenin.