Beispiel einer React Suchkomponente für Gatsby und dem Gatsby-Source-Ghost Plugin.
Ich möchte in diesen Artikel erläutern wie man eine simple React - Suchkomponente für Gatsby in kombination mit dem Headless CMS Ghost als Source erstellen kann.
Setup
Ihnen steht es selbstverständlich frei zu starten wie es Ihnen beliebt. Der Einfachheithalber nutze ich den gatsby-starter-ghost.
$ gatsby new suchen-beispiel https://github.com/TryGhost/gatsby-starter-ghost.git
Wir benötigen noch einige zusätzliche Module, die wir nun installieren. Vorab wechseln wir in den "suchen-beispiel" Ordner.
$ cd suchen-beispiel
$ npm install @tryghost/content-api react-icons
Eine React Komponente erstellen
Im Ordner "src/components/" erstellen wir ein Unterverzeichnis mit den Namen "/search". Dort speichern wir unsere JavaScript- und CSS-Datei.
React Komponente
Für den Anfang erstellen wir ein kleines Grundgerüst auf den wir dann später aufbauen. Hier werden schon alle benötigten Module geladen. Bis auf ein Div Element, das später als Container dienen soll, zurückgeben macht unsere Funktion noch nicht viel.
Hooks für State und Ref
Wir benötigen zwei States. Zum Einen den Active-State, damit wir speichern können ob die Komponente angezeigt werden soll oder nicht, und zum Anderen ein Object Array, welches die Suchergebnisse hält. Zudem benötigen wir zwei Referenzen. Eine für das Container Div Element und eine für das Input Element, welches wir auch gleich hinzufügen. Außerdem initialisieren wir die GhostContentAPI.
Open und Close Funktionen
Wir brauchen Funktionen, die das Anzeigen und Verstecken des Input Elements steuern.
Das Suchen von Beiträgen
Beim Tippen in das Input Element wird eine Suche durchgeführt und die Ergebnisse zurückgeliefert.
Laden der Such - Datensätze
Wir laden beim Initialisieren der Komponente die Datensätze, die durchsucht werden sollen, und erzeugen aus den Responses ein einheitliches Object Array. Das zweite Argument von useEffect ist ein Array das unterschiedliche States enthalten kann. React überprüft dann bei jeden neu rendern ob sich der State geändert hat und wenn dem nicht so ist wird der Effect nicht ausgeführt. Mit einen leeren Array [] als Argument, lässt React den Effect nur beim Mount und die zurückgegebene Funktion beim Unmount der Kompenente aus.
Eventhandler registrieren
Man hätte den Button Element auch einfach eine onClick Props zuweisen können um den Click Event zu triggern. Allerdings soll sich das Suchfeld schließen sobald auf etwas anderes als der Komponente geklickt wird. Daher greifen wir auf Side-Effect Hooks zurück. Diese verhalten sich wie componentDidMount, componentDidUpdate und componentWillUnmount bei React Komponenten Klassen.
Rendern der Komponente
Unsere Element Struktur ist noch nicht vollständig. Darum kümmern wir uns nun.
Das Style-Sheet
Auf das grundlegende Style-Sheet der Komponente möchte ich hier nicht mehr weiter eingehen.
Einbinden der Komponente
Das einbinden ist relativ einfach und wird in folgenden Code Abschnitt gezeigt.
Diese Implementation kann bei einem großen Datensatz zum Blockieren des UI führen. Im Artikel Gatsby-Ghost Suche: Webworker wird erläutert wie man dieses Beispiel um einen Webworker erweitern kann, um das Blockieren zu vermeiden.