filter by title or body substring. react

filter by title or body substring. react

Jeder Entwickler kennt diesen Moment, wenn die Suchleiste in der App zwar Buchstaben frisst, aber das Ergebnis sich anfühlt wie eine Lotterie. Man tippt ein Wort ein, erwartet eine präzise Liste, und stattdessen passiert entweder gar nichts oder die Anwendung friert für eine Sekunde ein. Wenn du eine Filter By Title Or Body Substring. React Komponente baust, geht es nicht nur darum, ein bisschen Text zu vergleichen. Es geht darum, wie Daten im Arbeitsspeicher liegen und wie effizient die Filterlogik arbeitet, bevor der Browser kapituliert. Eine schlechte Implementierung nervt die Nutzer und macht deine Oberfläche träge. Ich habe schon Projekte gesehen, bei denen die Suche bei 500 Datensätzen flüssig lief, aber bei 5000 Einträgen komplett in die Knie ging. Das Problem liegt meistens in der Art und Weise, wie der State verwaltet wird und wie tief die Suche in die Objektstruktur eingreift.

Die Logik hinter der Suche nach Teilstrings

Was passiert eigentlich unter der Haube, wenn wir nach einem Teilstring suchen? Im Kern nehmen wir einen Quelltext und prüfen, ob ein Zielwert darin enthalten ist. In JavaScript nutzen wir dafür meistens die Methode includes(). Das klingt simpel. Aber die Realität in modernen Web-Apps ist komplexer. Du hast oft ein Array von Objekten. Jedes Objekt hat einen Titel und einen Haupttext. Die Herausforderung besteht darin, beide Felder gleichzeitig zu durchsuchen, ohne dass der Code zu einem unleserlichen Chaos verkommt.

Groß- und Kleinschreibung ignorieren

Ein klassischer Fehler ist der Verzicht auf die Normalisierung. Wenn ein Nutzer nach „React“ sucht, dein Text aber „react“ enthält, findet die Standardmethode nichts. Das ist für den Anwender frustrierend. Ich wandle deshalb grundsätzlich beide Seiten des Vergleichs in Kleinbuchstaben um. Das sorgt für eine konsistente Erfahrung. Es gibt kaum Szenarien in einer normalen Suche, in denen die Case-Sensitivity einen echten Mehrwert bietet. Wer das ignoriert, baut eine Barriere für seine Nutzer auf.

Performance bei großen Datenmengen

Wenn dein Datensatz wächst, wird die Suche zum Flaschenhals. Stell dir vor, du filterst bei jedem Tastendruck. Bei 10.000 Einträgen führt React bei jedem Buchstaben ein komplettes Re-Rendering durch. Das ist Wahnsinn. Hier kommen Techniken wie Debouncing ins Spiel. Wir warten ein paar Millisekunden ab, bis der Nutzer mit dem Tippen fertig ist, bevor wir die Filterfunktion anwerfen. Das schont die CPU und macht die App spürbar flüssiger.

Filter By Title Or Body Substring. React in der Praxis

Die Umsetzung erfordert ein klares Verständnis von Hooks. Wir brauchen einen State für den Suchbegriff und einen für die gefilterten Daten. Oder noch besser: Wir berechnen die gefilterten Daten direkt während des Render-Vorgangs aus den Originaldaten, um inkonsistente Zustände zu vermeiden. Das ist sauberer und weniger fehleranfällig.

Der Einsatz von useMemo

Hier wird es interessant. Viele Entwickler vergessen, dass jede Änderung an irgendeinem State in der Komponente dazu führt, dass die gesamte Filterlogik erneut durchläuft. Wenn du useMemo einsetzt, sagst du React: „Berechne diese Liste nur neu, wenn sich entweder der Suchstring oder die ursprüngliche Liste ändert.“ Das spart massiv Rechenleistung. Gerade auf Mobilgeräten mit schwächeren Prozessoren macht das den Unterschied zwischen einer benutzbaren App und Elektroschrott.

Den Suchalgorithmus optimieren

Wir müssen uns entscheiden, wie wir Titel und Text gewichten. Soll ein Treffer im Titel weiter oben stehen als ein Treffer im Fließtext? In einer einfachen Implementierung werfen wir beides zusammen. Ein cleverer Weg ist die Erstellung eines Such-Strings pro Objekt, der aus beiden Feldern besteht. So muss man nur einmal includes() aufrufen. Das spart Zeit und Codezeilen.

Fehlerquellen beim Filtern von Objekten

Ich habe oft erlebt, dass Entwickler direkt auf dem State der Komponente arbeiten und dabei die Originaldaten überschreiben. Wenn der Nutzer dann die Suche löscht, sind alle Daten weg. Man muss das Original-Array immer als „Single Source of Truth“ behalten. Die gefilterte Ansicht ist lediglich eine Projektion dieser Daten.

Null-Werte und Undefined

Ein weiterer Stolperstein sind fehlende Daten. Wenn ein Objekt keinen Textkörper hat, wirft body.toLowerCase() sofort einen Fehler. Die gesamte App stürzt ab. Man muss immer mit optional chaining oder Standardwerten arbeiten. Sicherheit geht vor Schönheit beim Code. Ein einfacher Check wie (item.body || '') rettet dir hier den Tag. Es ist erstaunlich, wie oft dieser simple Schutzmechanismus in Produktionscode fehlt.

Sonderzeichen und Regex

Manche Nutzer tippen gerne Sonderzeichen ein. Wenn du reguläre Ausdrücke für die Suche verwendest, musst du diese unbedingt escapen. Ein Punkt oder ein Fragezeichen hat in Regex eine besondere Bedeutung. Wenn du das nicht abfängst, wird die Suche unberechenbar. Für die meisten Fälle ist die einfache includes() Methode jedoch ohnehin die bessere und sicherere Wahl. Sie ist schnell und deckt 95 Prozent der Anwendungsfälle ab.

Architektur der Suchkomponente

Man sollte die Logik von der Darstellung trennen. Eine Suchleiste sollte nur eine Suchleiste sein. Die Logik, wie die Daten gefiltert werden, gehört entweder in einen benutzerdefinierten Hook oder in die übergeordnete Komponente, die die Daten verwaltet. Das macht den Code testbar. Du kannst die Filterfunktion isoliert prüfen, ohne ein komplettes DOM-Element rendern zu müssen.

Warum kontrollierte Komponenten wichtig sind

In React nutzen wir fast immer kontrollierte Inputs. Das bedeutet, der Wert des Eingabefeldes wird vom State der Komponente gesteuert. Das gibt uns die volle Kontrolle darüber, was der Nutzer sieht und was wir mit der Eingabe machen. Wir können den Text trimmen, unerwünschte Zeichen entfernen oder die Länge begrenzen, bevor die Suche überhaupt startet.

Feedback für den Nutzer

Nichts ist schlimmer als eine leere Seite ohne Nachricht. Wenn die Suche keine Ergebnisse liefert, muss das klar kommuniziert werden. Ein einfacher Text wie „Keine Treffer für deine Suche“ reicht aus. Aber man sollte auch den Suchbegriff nochmal anzeigen. So sieht der Nutzer sofort, ob er sich vielleicht vertippt hat. Das ist einfaches UX-Design, das oft vergessen wird.

Fortgeschrittene Techniken für Filter By Title Or Body Substring. React

Wenn die Anforderungen steigen, reicht eine einfache Teilstring-Suche oft nicht mehr aus. Nutzer erwarten heute, dass eine Suche „intelligent“ ist. Das bedeutet, sie soll auch dann Ergebnisse liefern, wenn man sich leicht vertippt hat oder wenn man nach Synonymen sucht. Das führt uns in den Bereich der Fuzzy-Suche.

📖 Verwandt: diesen Leitfaden

Integration von Bibliotheken

Man muss das Rad nicht immer neu erfinden. Es gibt großartige Werkzeuge, die genau dieses Problem lösen. Eine bekannte Lösung ist Fuse.js. Diese Bibliothek erlaubt eine gewichtete Suche und verträgt auch Tippfehler. Das ist besonders nützlich, wenn die Texte lang sind und Nutzer schnell etwas finden wollen. Die Integration in React ist denkbar einfach, da man die Bibliothek innerhalb eines useMemo Hooks aufrufen kann. Eine Dokumentation zu solchen JavaScript-Standards findet man oft auf Plattformen wie dem Mozilla Developer Network, die eine exzellente Basis für Web-Technologien bieten.

Serverseitiges Filtern

Ab einer gewissen Datenmenge – wir reden hier von mehreren tausend Einträgen – stößt der Client an seine Grenzen. Dann ist es Zeit, die Filterlogik auf den Server zu verschieben. Anstatt alle Daten zu laden und lokal zu filtern, schickst du den Suchstring als Query-Parameter an eine API. Der Server nutzt dann spezialisierte Datenbank-Indizes, um die Ergebnisse in Millisekunden zurückzuliefern. Das reduziert die Netzwerklast enorm. In der React-App musst du dann lediglich den Ladezustand und mögliche Fehler der API-Anfrage verwalten.

Web Performance und Barrierefreiheit

Eine Suchfunktion muss für jeden zugänglich sein. Das bedeutet, dass Eingabefelder korrekte Labels brauchen. Screenreader müssen verstehen, was gerade passiert. Wenn sich die Liste der Ergebnisse ändert, sollte das dem Nutzer mitgeteilt werden, ohne ihn zu unterbrechen. Aria-Live-Regionen sind hier das Werkzeug der Wahl. Sie informieren assistierende Technologien über Updates im Inhalt.

Tastaturbedienbarkeit

Ein Profi-Tipp: Sorge dafür, dass man die Suche komplett mit der Tastatur bedienen kann. Man sollte mit Tab zum Eingabefeld springen können und mit den Pfeiltasten durch die Ergebnisse navigieren können. Das steigert die Produktivität enorm. Wer einmal eine App nur mit der Tastatur bedient hat, merkt schnell, wie wichtig ein logischer Fokus-Flow ist.

Visuelle Stabilität

Achte darauf, dass das Layout nicht springt, wenn Ergebnisse geladen werden oder die Liste plötzlich kürzer wird. Reserviere Platz für die Ergebnisliste oder nutze Skeleton-Screens. Das verhindert den sogenannten Layout Shift, der nicht nur nervig ist, sondern auch das Google-Ranking deiner Seite negativ beeinflussen kann. Offizielle Metriken dazu stellt Google unter Web.dev zur Verfügung, wo man viel über Core Web Vitals lernen kann.

Lokale Datenspeicherung und Caching

Wenn Nutzer häufig dieselben Begriffe suchen, kannst du die Ergebnisse im Browser zwischenspeichern. Der localStorage oder die IndexedDB bieten sich hier an. Das ist besonders effektiv bei Apps, die auch offline funktionieren sollen. Progressive Web Apps machen davon regen Gebrauch. Wenn du die Daten einmal vom Server geholt hast, kannst du sie lokal vorhalten und die Filterung direkt im Browser durchführen, solange der Datensatz handhabbar bleibt.

Die Rolle von Service Workern

Service Worker können Anfragen abfangen und gecachte Daten ausliefern. Das macht die Suche extrem schnell, da keine Netzwerk-Latenz anfällt. Für eine React-App bedeutet das, dass die Filter-Logik fast verzögerungsfrei reagiert. Es fühlt sich für den Nutzer wie eine native Anwendung an. Das ist das Ziel, das wir als Entwickler immer verfolgen sollten.

Datensicherheit beim Filtern

Ein Aspekt, der oft unterschätzt wird, ist die Sicherheit. Auch wenn wir im Frontend filtern, dürfen wir niemals sensible Daten im JSON-Objekt an den Client schicken, die der Nutzer eigentlich nicht sehen darf. Nur weil wir sie im UI wegfiltern, heißt das nicht, dass sie nicht im Netzwerk-Tab des Browsers sichtbar sind. Filterung im Frontend ist eine Komfortfunktion, kein Sicherheitsfeature. Alles, was beim Nutzer ankommt, muss für ihn bestimmt sein. Das Bundesamt für Sicherheit in der Informationstechnik bietet auf seiner Webseite BSI wertvolle Hinweise zur allgemeinen IT-Sicherheit, die man auch bei der Webentwicklung im Hinterkopf behalten sollte.

Strategien für die UI-Entwicklung

Wie präsentieren wir die Ergebnisse? Eine einfache Liste ist oft langweilig. Wir können die gefundenen Teilstrings im Text hervorheben. Das gibt dem Nutzer sofortiges visuelles Feedback, warum ein bestimmtes Ergebnis angezeigt wird. In React lässt sich das mit einer kleinen Hilfsfunktion lösen, die den String an den Stellen des Treffers aufsplittet und den Treffer in ein <span>-Tag mit gelbem Hintergrund wickelt.

💡 Das könnte Sie interessieren: fritz box 5690 pro mediamarkt

Endloses Scrollen vs. Pagination

Wenn die Suche hunderte Treffer liefert, solltest du sie nicht alle auf einmal rendern. Infinite Scrolling ist modern, aber Pagination ist oft benutzerfreundlicher, da man eine feste Referenz hat, wo man sich befindet. In React lässt sich beides gut umsetzen. Bei Infinite Scrolling musst du allerdings darauf achten, dass du die Event-Listener für das Scrollen wieder entfernst, um Memory Leaks zu vermeiden.

AbortController nutzen

Wenn du eine serverseitige Suche implementierst, solltest du den AbortController verwenden. Wenn der Nutzer einen neuen Buchstaben tippt, während die alte Anfrage noch läuft, brichst du die alte Anfrage einfach ab. Das spart Ressourcen auf dem Server und verhindert, dass veraltete Daten die aktuelle Anzeige überschreiben. Es ist eine saubere Lösung für ein klassisches Race-Condition-Problem in asynchronen Anwendungen.

Zusammenstellung der Filterlogik

Hier ist ein konkretes Beispiel, wie man die Logik strukturiert. Wir haben ein Array von Blogposts. Jeder Post hat eine ID, einen Titel und einen Inhalt.

  1. Erstelle einen State für den Suchbegriff: const [query, setQuery] = useState('').
  2. Erstelle den gefilterten Output: const filteredPosts = useMemo(() => { ... }, [query, allPosts]).
  3. Innerhalb von useMemo normalisierst du den Suchbegriff: const lowerCaseQuery = query.toLowerCase().trim().
  4. Wenn der Suchbegriff leer ist, gibst du alle Posts zurück.
  5. Andernfalls filterst du das Array: allPosts.filter(post => post.title.toLowerCase().includes(lowerCaseQuery) || post.body.toLowerCase().includes(lowerCaseQuery)).

Dieser Ansatz ist robust und performant genug für die meisten Anwendungen. Er ist leicht zu lesen und noch leichter zu warten. Wenn später ein weiteres Feld wie „Kategorie“ dazu kommt, musst du nur eine weitere Bedingung in den Filter einbauen.

Nächste Schritte für dein Projekt

Du hast jetzt das Fundament. Setz dich an deinen Editor und geh diese Punkte durch:

  • Prüfe deine aktuelle Filterlogik auf Case-Sensitivity. Wenn sie noch strikt unterscheidet, ändere das sofort. Nutzer erwarten eine Fehlertoleranz bei der Groß- und Kleinschreibung.
  • Implementiere useMemo für deine Filter-Operationen. Schau dir in den React DevTools an, wie viele unnötige Re-Renderings du dadurch einsparst. Der Unterschied wird dich überraschen.
  • Füge einen einfachen Check für Null-Werte hinzu. Deine App darf nicht abstürzen, nur weil ein Datenbankfeld mal leer ist. Das ist die einfachste Form der Qualitätssicherung.
  • Wenn deine Liste mehr als 1000 Einträge hat, experimentiere mit einem Debounce-Hook. Es gibt fertige Lösungen dafür, oder du schreibst dir einen kleinen useEffect, der einen Timer setzt.
  • Überlege dir, wie du Treffer visuell hervorheben kannst. Ein bisschen CSS und eine Split-Funktion reichen aus, um die User Experience massiv zu verbessern.

Anstatt dich in komplexen Architekturen zu verlieren, fang klein an. Eine solide Suche ist das Herzstück vieler Anwendungen. Wenn sie schnell ist und genau das liefert, was der Nutzer sucht, hast du schon gewonnen. Es braucht keinen magischen Algorithmus, sondern nur saubere Handarbeit und ein Auge für Details. Viel Erfolg beim Coden.

SP

Sophie Peters

Mit faktenbasierter Arbeitsweise liefert Sophie Peters Beiträge, die Leserinnen und Lesern Orientierung im Nachrichtengeschehen geben.