Jamdesk Documentation logo

Benutzerdefinierte React-Komponenten

Definieren und verwenden Sie eigene React-Komponenten in MDX-Dateien mit serverseitigem Rendering, Tailwind-Styling und Zugriff auf eingebaute Jamdesk-Komponenten.

Definieren Sie benutzerdefinierte React-Komponenten direkt in MDX-Dateien. Exportieren Sie eine Pfeilfunktions-Komponente am Anfang der Datei und verwenden Sie sie inline. Komponenten werden zur Build-Zeit auf dem Server gerendert. Sie können alle eingebauten Jamdesk-Komponenten sowie Tailwind-Klassen verwenden.

Grundlegende Verwendung

Definieren Sie eine Komponente mit export const am Anfang Ihrer MDX-Datei:

export const Highlight = ({ children, color }) => (
  <span style={{ backgroundColor: color, padding: '0.2em 0.4em', borderRadius: '4px' }}>
    {children}
  </span>
);

This text has a <Highlight color="#ffeb3b">yellow highlight</Highlight> in it.

Komponentennamen müssen in PascalCase geschrieben werden (mit einem Großbuchstaben beginnen).

Beispiel: Hero-Karte

Dieses Beispiel verwendet mehrere Props und Tailwind-Klassen:

export const HeroCard = ({ title, description, href, icon }) => (
  <a
    href={href}
    className="group block p-6 rounded-lg border border-gray-200 hover:border-blue-500 transition-colors"
  >
    <div className="flex items-center gap-3 mb-2">
      <Icon icon={icon} />
      <h3 className="font-semibold text-lg">{title}</h3>
    </div>
    <p className="text-gray-600">{description}</p>
  </a>
);

<div className="grid grid-cols-2 gap-4">
  <HeroCard
    title="Getting started"
    description="Learn the basics"
    href="/quickstart"
    icon="rocket"
  />
  <HeroCard
    title="Components"
    description="Explore available components"
    href="/components/overview"
    icon="puzzle-piece"
  />
</div>

Integrierte Komponenten verwenden

Benutzerdefinierte Komponenten können jede eingebaute Jamdesk-Komponente ohne Import verwenden:

export const FeatureCard = ({ title, children }) => (
  <Card title={title} icon="star">

    {children}
    <Tip>This tip is inside a custom component!</Tip>
</Card>
);

<FeatureCard title="My Feature">
  <Note>Notes work inside custom components too!</Note>
</FeatureCard>

Eingebaute Komponenten nach Kategorie:

KategorieKomponenten
HinweiseNote, Tip, Info, Warning, Check, Danger
LayoutCard, Columns, Tabs, Tab, Accordion, Steps, Step, View
MedienFrame, Icon, Badge, Tooltip
CodeCodeGroup
API-DokumentationParamField, ResponseField, Expandable

Einschränkungen

  • Nur Pfeilfunktionen: Verwenden Sie die Syntax export const. Die Syntax export function wird nicht unterstützt.
  • Keine Imports: Sie können keine externen Pakete oder anderen Dateien importieren.
  • Keine Hooks: React-Hooks (useState, useEffect, useRef usw.) sind nicht verfügbar. Komponenten werden während des Builds serverseitig gerendert. Hooks funktionieren nur clientseitig. Verwenden Sie Snippet-Dateien für interaktive Komponenten (siehe Fehlerbehebung unten).
  • Nur serverseitig: Komponenten werden auf dem Server gerendert. Es gibt keine clientseitige Interaktivität oder Event-Handler.
  • Nur Tailwind: Gestalten Sie mit Tailwind-CSS-Klassen. CSS-in-JS ist nicht verfügbar.
  • Strikte Syntax: Ein Syntaxfehler in einer Inline-Komponente lässt den Build mit einer eindeutigen Fehlermeldung fehlschlagen.
  • PascalCase-Namen: Komponentennamen müssen mit einem Großbuchstaben beginnen und dürfen nur Buchstaben und Zahlen enthalten (keine Unterstriche).

Benötigen Sie React-Hooks? Inline-Komponenten können useState, useEffect oder andere Hooks nicht verwenden. Sie werden während des Builds auf dem Server gerendert. Erstellen Sie für Komponenten, die State oder Effekte benötigen, eine Snippet-Datei mit der Direktive 'use client' (siehe Abschnitt zur Fehlerbehebung unten).

Best Practices

1
Komponenten einfach halten

Inline-Komponenten sollten präsentational sein. Für komplexe Logik fordern Sie eine eingebaute Komponente an.

2
Semantisches HTML verwenden

Erstellen Sie barrierefreie Komponenten mit passenden HTML-Elementen und ARIA-Attributen.

3
Gründlich testen

Zeigen Sie Ihre Dokumentation lokal in der Vorschau an. Prüfen Sie, ob die Komponenten auch im Dunkelmodus korrekt dargestellt werden.

Fehlerbehebung

Fehler: Expected component 'MyComponent' to be defined

Ursachen:

  • Der Komponentenname verwendet kein PascalCase (muss mit einem Großbuchstaben beginnen)
  • Syntaxfehler in der Komponentendefinition
  • Fehlendes schließendes Tag oder fehlende Klammer

Lösung: Prüfen Sie, ob Ihr Export diesem Muster folgt:

export const MyComponent = ({ prop }) => (
  <div>{prop}</div>
);

Fehler: Der Build schlägt fehl mit einem Hinweis auf Babel oder JSX-Syntax

Ursachen:

  • Ungültige JSX-Syntax in Ihrer Komponente
  • Nicht geschlossene Tags oder Klammern
  • Verwendung nicht unterstützter JavaScript-Funktionen

Lösung: Überprüfen Sie, ob Ihr JSX gültig ist. Häufige Probleme:

  • Alle Tags müssen geschlossen sein (<img loading="lazy" /> statt <img loading="lazy">)
  • Verwenden Sie className statt class
  • Umschließen Sie mehrere Elemente mit einem Fragment <>...</> oder einem übergeordneten Element

Warnung: Inline component(s) override built-in: Note

Ursache: Ihre Inline-Komponente hat denselben Namen wie eine eingebaute Komponente.

Lösung: Benennen Sie Ihre Komponente um, um Konflikte zu vermeiden:

// Instead of: export const Note = ...
export const CustomNote = ({ children }) => (
  <div className="my-note">{children}</div>
);

Problem: Tailwind-Klassen funktionieren nicht

Ursachen:

  • Verwendung von CSS-in-JS oder Inline-Style-Objekten (eingeschränkte Unterstützung)
  • Tailwind-Klasse ist nicht im Build enthalten

Lösung: Verwenden Sie Standard-Tailwind-Utility-Klassen. Für benutzerdefinierte Styles verwenden Sie ein Inline-style-Prop mit einfachen Werten:

export const Highlight = ({ children }) => (
  <span style={{ backgroundColor: '#ffeb3b' }}>{children}</span>
);

Problem: Eine mit export function definierte Komponente wird nicht gerendert

Ursache: Nur die Syntax export const mit Pfeilfunktionen wird unterstützt.

Lösung: Wandeln Sie Ihre Funktion in die Pfeilfunktions-Syntax um:

// Instead of:
export function MyComponent({ prop }) {
  return <div>{prop}</div>;
}

// Use:
export const MyComponent = ({ prop }) => (
  <div>{prop}</div>
);

Problem: Eine Komponente mit Unterstrichen oder Sonderzeichen funktioniert nicht

Ursache: Komponentennamen müssen gültige PascalCase-Bezeichner sein (nur Buchstaben und Zahlen).

Lösung: Verwenden Sie in Ihrem Komponentennamen nur Buchstaben und Zahlen:

// Instead of: export const Hero_Card = ...
// Instead of: export const my-component = ...
export const HeroCard = ({ title }) => (
  <div>{title}</div>
);

Fehler: ReferenceError: useState is not defined

Ursache: React-Hooks sind in Inline-Komponenten nicht verfügbar. Inline-Komponenten werden während des Builds serverseitig gerendert. Hooks funktionieren nur in clientseitigen React-Komponenten.

Lösung: Erstellen Sie für interaktive Komponenten, die State oder Effekte benötigen, eine Snippet-Datei:

  1. Erstellen Sie eine Datei in Ihrem Verzeichnis /snippets (z. B. /snippets/counter.tsx)
  2. Fügen Sie am Anfang der Datei 'use client' hinzu
  3. Importieren und verwenden Sie sie in Ihrer MDX-Datei
/snippets/counter.tsx
'use client';

import { useState } from 'react';

export function Counter() {
  const [count, setCount] = useState(0);
  return (
    <button onClick={() => setCount(c => c + 1)}>
      Count: {count}
    </button>
  );
}
your-page.mdx
import { Counter } from '/snippets/counter';

<Counter />

Wie geht es weiter?

Snippets

Wiederverwendbare Komponenten über Seiten hinweg, auch interaktive mit Hooks

Komponentenübersicht

Eingebaute Komponenten entdecken