React
Hooks
Desenvolvimento
JavaScript
React19

Erkundung von React Hooks und React 19-Innovationen

Erkundung von React Hooks und React 19-Innovationen

Hooks revolutionierten die React-Entwicklung, indem sie es funktionalen Komponenten ermöglichten, Status, Nebenwirkungen und komplexe Logik elegant zu verwalten. Mit React 19 wurden neue Hooks eingeführt, um den Workflow weiter zu rationalisieren. In diesem Artikel werden wir klassische Hooks, erweiterte Hooks und die Neuerungen in Version 19 anhand praktischer Beispiele untersuchen.


Grundlegende Reaktionshaken

useState: Einfache Statusverwaltung

Verwaltet lokale Zustände in Funktionskomponenten. Ideal für Werte, die sich im Laufe der Zeit ändern.

Beispiel: Interaktiver Zähler

import { useState } aus 'react';

Funktion Counter() { const [count, setCount] = useState(0);

zurück (

Sie haben {count} Mal geklickt

<button onClick={() => setCount(count + 1)}> Inkrement
); }


useEffect: Nebenwirkungen

Führt Code nach dem Rendern aus, z. B. API-Aufrufe oder DOM-Manipulation.

Beispiel: Daten von einer API abrufen

import { useState, useEffect } from 'react';

Funktion UserList() { const [users, setUsers] = useState([]);

useEffect(() => { fetch('https://api.example.com/users') .then(response => Response.json()) .then(data => setUsers(data)); }, []); // Nur einmal ausführen

zurück (

    {users.map(user => (
  • {user.name}
  • ))}
); }


useContext: Globale Statusfreigabe

Greift auf Kontextwerte zu, ohne Prop Drilling durchzuführen.

Beispiel: Dunkel/Hell-Thema

import { createContext, useContext, useState } from 'react';

const ThemeContext = createContext();

Funktion App() { const [theme, setTheme] = useState('light');

zurück ( <ThemeContext.Provider value=> </ThemeContext.Provider> ); }

Funktion Toolbar() { const { theme, setTheme } = useContext(ThemeContext);

zurück ( <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}> Zum Thema wechseln {theme === 'light' ? 'dunkel': 'hell'} ); }


useRef: Veränderbare Referenzen

Speichert Werte, die zwischen den Renderings bestehen bleiben, ohne dass es zu erneuten Renderings kommt.

Beispiel: Fokus auf Eingabe

import { useRef } aus 'react';

Funktion TextInput() { const inputRef = useRef(null);

const focusInput = () => { inputRef.current.focus(); };

zurück (

); }


Erweiterte und benutzerdefinierte Hooks

useReducer: Komplexer Zustand

Verwaltet Zustände mit ausgefeilterer Logik, ähnlich wie Redux.

Beispiel: Aufgabenliste

import { useReducer } aus 'react';

Funktion todosReducer(state, action) { switch (action.type) { Fall 'ADD_TODO': return [...state, { text: action.text, abgeschlossen: false }]; Fall 'TOGGLE_TODO': return state.map((todo, index) => index === action.index ? { ...todo, abgeschlossen: !todo.completed } : todo ); Standard: Rückkehrzustand; } }

Funktion TodoApp() { const [Todos, Dispatch] = useReducer(todosReducer, []);

const handleSubmit = (e) => { e.preventDefault(); Dispatch({ Typ: 'ADD_TODO', Text: e.target.elements.todo.value }); e.target.reset(); };

zurück (

{todos.map((todo, index) => ( < key={index} onClick={() => Dispatch({ Typ: 'TOGGLE_TODO', Index })} style={ textDecoration: todo.completed ? 'line-through' : 'none' } > {todo.text}
))} ); }


useMemo und useCallback: Leistungsoptimierung

  • useMemo: Speichert berechnete Werte.
  • useCallback: Merkt sich Funktionen.

Beispiel: Schwere Berechnung

import { useMemo, useState } from 'react';

Funktion ExpensiveComponent({ list }) { const sortedList = useMemo(() => { console.log('Bestellliste...'); return [...list].sort(); }, [Liste]);

return

{sortedList.join(', ')}
; }


Benutzerdefinierte Hooks: Wiederverwendung von Logik

Beispiel: useFetch für HTTP-Anfragen

import { useState, useEffect } from 'react';

Funktion useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true);

useEffect(() => { abrufen(URL) .then(res => res.json()) .then(data => { setData(date); setLoading(false); }); }, [URL]);

return { Daten, wird geladen }; }

// Verwendung in der Komponente: Funktion UserProfile({ userId }) { const { Daten: Benutzer, wird geladen } = useFetch(https://api.example.com/users/${userId});

if (loading) return

Loading...
; return
{user.name}
; }


Neue React 19 Hooks

useOptimistic: Optimistische Updates

Aktualisiert die Benutzeroberfläche vor dem Server-Commit und führt bei einem Fehler ein Rollback durch.

Beispiel: Hinzufügung eines optimistischen Kommentars

import { useOptimistic } from 'react';

Funktion CommentForm({ onSubmit }) { const [optimisticComments, addOptimisticComment] = useOptimistic( [], (state, newComment) => [...state, { text: newComment, sent: true }] );

const handleSubmit = async (e) => { e.preventDefault(); const formData = new FormData(e.target); const comment = formData.get('comment');

addOptimisticComment(comment);

versuche es mit {
  Warten Sie auf onSubmit(comment);
} Catch (Fehler) {
  // Die Benutzeroberfläche zurücksetzen, wenn die Anfrage fehlschlägt
}

};

zurück (

{optimisticComments.map((comment, index) => ( <div style=> {comment.text}
))} ); }


useResource: Integration mit Suspense

Verwaltet asynchrone Daten deklarativ.

Beispiel: Laden von Daten mit Fallback

import { useResource, Suspense } from 'react';

Funktion fetchUser(id) { // Gibt ein Versprechen zurück }

Funktion UserProfile({ userId }) { const userResource = useResource(() => fetchUser(userId));

return

{userResource.read().name}
; }

// Verwendung in der übergeordneten Komponente: <Suspense fallback={

Benutzer wird geladen...
}>


useEventListener: Vereinfachte Ereignis-Listener

Verwaltet Ereignis-Listener sauber.

Beispiel: Fenstergröße überwachen

import { useEventListener } aus 'react';

Funktion WindowSize() { const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight });

useEventListener('resize', () => { setSize({ width: window.innerWidth, height: window.innerHeight }); });

return

Fenstergröße: {size.width}x{size.height}
; }


useMediaQuery: Responsive Design

Reagiert auf Änderungen in Medienanfragen.

Beispiel: Dunkles Theme mit Systemeinstellungen

import { useMediaQuery } aus 'react';

Funktion DarkModeToggle() { constprefersDark = useMediaQuery('(prefers-color-scheme: dark)'); const [isDark, setIsDark] = useState(prefersDark);

// Aktualisieren Sie das Site-Thema hier ...

zurück ( <button onClick={() => setIsDark(!isDark)}> {isDark? 'Dunkelmodus deaktivieren': 'Dunkelmodus aktivieren'} ); }


useErrorBoundary: Elegante Fehlerbehandlung

Fängt Fehler in untergeordneten Komponenten ab.

Beispiel: Benutzerdefinierter Fehlerschwellenwert

import { useErrorBoundary } from 'react';

Funktion ErrorProneComponent() { const { ErrorBoundary, didCatch, error } = useErrorBoundary();

return didCatch ? (

Es ist ein Fehler aufgetreten: {error.message}
) : ( ); }


Fazit

React-Hooks entwickeln sich ständig weiter und bringen leistungsstarke Tools mit sich, die die Entwicklung vereinfachen. Mit React 19 verbessern Funktionen wie useOptimistic und useResource das Benutzererlebnis, indem sie asynchrone Vorgänge reibungslos verarbeiten, während Hooks wie useMediaQuery und useEventListener die Erstellung adaptiver Schnittstellen erleichtern.

Wenn Sie diese Hooks beherrschen, von den Grundlagen bis hin zu den neuesten, sind Sie in der Lage, robustere, leistungsfähigere und einfacher zu wartende Anwendungen zu erstellen. Versuchen Sie, diese Techniken in Ihre Projekte zu integrieren und sehen Sie, wie sie Ihren Arbeitsablauf verändern! 🚀

Lesen Sie auch