Komponenten und Hooks

Komponenten und Hooks

Bausteine einer React-Anwendung:

  • Komponenten: für das UI / View
  • Hooks: für das Modell / die Logik hinter dem View

Hooks

Hooks = besondere Funktionen, die in einer Komponentenfunktion aufgerufen werden können

Beispiele:

  • useState
  • useEffect: zum Auslösen von Side Effects, wie z.B. API-Anfragen
  • useQuery: für eine einfachere Möglichkeit, APIs anzufragen
  • useTodos: eigener Hook zum Verwalten einer Liste von Todos

Regeln für Hooks

in einer Komponentendefinition:
Hooks müssen bei jedem Rendering in der gleichen Reihenfolge aufgerufen werden

(React verwendet die Reihenfolge, um den "gleichen" Hook-Aufruf über mehrere Renderings zu verfolgen)

Rules of Hooks auf reactjs.org

Externe Komponenten und Hooks

Externe Komponenten und Hooks

Beispiele für Komponenten und Hooks aus Libraries:

  • MUI (Material-UI): <Button>, <Alert>, ...
  • React Router: <Route>, <Link>, useParams, useNavigate
  • react-query: useQuery
  • react-hook-form: useForm
  • React Built-Ins: <Suspense>, useEffect, useContext, ...

Komponenten und Hooks

Listen verfügbarer Komponenten und Hooks:

awesome-react-components: Liste von Komponenten, ...

awesome-react-hooks: liste von Hooks

Eigene Komponenten und Hooks

Eigene Komponenten und Hooks

Zwecke:

  • Strukturierung von Code
  • Wiederverwenden von Code / Funktionalität

Eigene Komponenten und Hooks

Beispiele für Komponenten zur Wiederverwendung (innerhalb eines Projektes oder über Projekte hinweg):

  • Button (zum Styling)
  • Calendar
  • ProgressBar

Eigene Komponenten und Hooks

Beispiel für Komponenten zur Strukturierung von Code:

  • TodoApp
  • TodoList
  • TodoItem

Eigene Komponenten und Hooks

Beispiele für eigene Hooks:

in einer Todo-Anwendung: useTodos

in einem Online-Shop: useProducts, useCart

Beispiel: Todo-Anwendung

eigene Komponenten und eigener Hook für eine Todo-Anwendung:

function TodoApp() {
  const todoData = useTodos();
  return (
    <div>
      <Header />
      <AddTodo onAdd={todoData.addTodo} />
      <TodoList
        todos={todoData.todos}
        onDelete={todoData.deleteTodo}
        onCompletedChange={todoData.setCompleted}
      />
      <Statistics todos={todoData.todos} />
    </div>
  );
}