|
| 1 | +--- |
| 2 | +title: "Vorlesung Webengineering 1 - React & Next" |
| 3 | +topic: "Webengineering_1_10" |
| 4 | +date: 2026-02-18 |
| 5 | +author: "Silas Schnurr" |
| 6 | +theme: "Berlin" |
| 7 | +colortheme: "dove" |
| 8 | +fonttheme: "structurebold" |
| 9 | +fontsize: 12pt |
| 10 | +urlcolor: olive |
| 11 | +linkstyle: boldslanted |
| 12 | +aspectratio: 169 |
| 13 | +lang: de-DE |
| 14 | +section-titles: true |
| 15 | +plantuml-format: svg |
| 16 | +... |
| 17 | + |
| 18 | +# Starten mit React & Next.js |
| 19 | + |
| 20 | +## Was ist React? |
| 21 | + |
| 22 | +- React ist eine JavaScript-Bibliothek zur Erstellung interaktiver Benutzeroberflächen. |
| 23 | +- React-Komponenten sind wie JavaScript-Funktionen, die Eingaben (Props) entgegennehmen und React-Elemente zurückgeben, welche das UI beschreiben. |
| 24 | +- React ist sehr unopinioniert und fokussiert sich hauptsächlich auf das Rendern von UI-Komponenten; für ein vollständiges App-Setup werden andere Tools (Build-System, Routing etc.) oft zusätzlich eingesetzt. |
| 25 | +- React nutzt JSX: eine HTML-ähnliche Syntax, die direkt in JavaScript eingebettet wird. |
| 26 | +- React verwendet ein virtuelles DOM (Virtual DOM): Eine interne Darstellung des UI im Arbeitsspeicher, die mit dem echten Browser-DOM abgeglichen und aktualisiert wird. |
| 27 | + |
| 28 | +## Was ist Next.js? |
| 29 | + |
| 30 | +- Next.js ist ein Framework basierend auf React, das zusätzliche Bausteine für Webanwendungen bereitstellt. |
| 31 | + - Damit ist es genau ein solches Tool, um auf Basis von React ein vollständiges App-Setup zu erreichen. |
| 32 | +- Next.js kümmert sich um Tooling und Konfiguration für React und bringt Struktur, Funktionen und Optimierungen mit. |
| 33 | + |
| 34 | +## Unterschiede: React vs. Next.js |
| 35 | + |
| 36 | +- React ist eine reine UI-Bibliothek; Routing und Server-Rendering kommen nicht von selbst. Typischerweise startet man mit create-react-app oder ähnlichen Tools. |
| 37 | +- Mit Next.js entsteht schnell eine strukturierte App, während man weiterhin in React bekannte Konzepte wie Komponenten und Hooks verwendet. |
| 38 | +- Next.js verbessert oft SEO (durch statisches Pre-Rendering) und Performance (durch Caching und SSR) im Vergleich zu einer reinen React-SPA. |
| 39 | + |
| 40 | +## Virtuelles DOM und Rendering |
| 41 | + |
| 42 | +- React erstellt ein virtuelles DOM im Arbeitsspeicher und vergleicht Änderungen dort mit dem echten DOM. |
| 43 | +- Entwickler geben nur an, wie das UI in einem bestimmten Zustand aussehen soll; React kümmert sich selbsttätig um die notwendigen DOM-Updates (Reconciliation). |
| 44 | +- Dieser declarative Ansatz macht die UI-Entwicklung einfacher und reduziert Fehler, da man nicht manuell DOM-Operationen durchführen muss. |
| 45 | + |
| 46 | +## Neues Projekt erstellen und ausführen |
| 47 | + |
| 48 | +- `npx create-next-app@latest` ausführen. Ein Assistent begleitet die Projekterstellung. |
| 49 | +- `npm run dev` im Projektverzeichnis ausführen |
| 50 | + |
| 51 | +> Hinweis: Node muss installiert sein. |
| 52 | +> [Referenz von nextjs.org](https://nextjs.org/docs/app/getting-started/installation) |
| 53 | + |
| 54 | +## Projektstruktur |
| 55 | + |
| 56 | +Struktur eines neu erstellten Projekts: |
| 57 | + |
| 58 | +- public [(Statische Inhalte, welche bereitgestellt werden sollen)](https://nextjs.org/docs/app/api-reference/file-conventions/public-folder) |
| 59 | + - Bild 1 |
| 60 | + - Bild 2 |
| 61 | +- src/app |
| 62 | + - globals.css |
| 63 | + - layout.tsx / layout.jsx (Haupteinstiegspunkt der Anwendung) |
| 64 | + - page.module.css |
| 65 | + - page.tsx / page.jsx (Startseite) |
| 66 | +- next.config.js [(Konfigurationsdatei für Next.js)](https://nextjs.org/docs/app/api-reference/config/next-config-js) |
| 67 | +- package.json (Projektreferenzen und Skripte) |
| 68 | + |
| 69 | +> [Referenz von nextjs.org](https://nextjs.org/docs/app/getting-started/project-structure) |
| 70 | + |
| 71 | +# Komponenten |
| 72 | + |
| 73 | +## Beispiel Komponente |
| 74 | + |
| 75 | +Eine Komponente ist eine JavaScript-Funktion, die props (Eigenschaften) als Argument annimmt und JSX zurückgibt. Beispiel: |
| 76 | + |
| 77 | +```jsx |
| 78 | +import React from "react"; |
| 79 | +
|
| 80 | +function SimpleComponent() { |
| 81 | + const greeting = "Hallo, React!"; |
| 82 | + return ( |
| 83 | + <div> |
| 84 | + <h1>{greeting}</h1> |
| 85 | + <p>Dies ist eine einfache React-Komponente mit JSX.</p> |
| 86 | + </div> |
| 87 | + ); |
| 88 | +} |
| 89 | +export default SimpleComponent; |
| 90 | +``` |
| 91 | + |
| 92 | +## Verwenden einer Komponente (1) |
| 93 | + |
| 94 | +- Komponenten können nach einem import in anderen komponenten oder Layouts verwendet werden |
| 95 | +- Komponenten-Namen beginnen mit Großbuchstaben (z.B. SimpleComponent), andernfalls interpretiert React sie als DOM-Tags. |
| 96 | +- JSX erlaubt das Verschachteln von Elementen wie in HTML. |
| 97 | + - Fragments (<> ... </>) erlauben es, mehrere JSX-Elemente zurückzugeben, ohne zusätzliche Wrapper-Elemente im DOM zu erzeugen. |
| 98 | +- Komponenten können beliebig verschachtelt und wiederverwendet werden (Komposition) |
| 99 | + |
| 100 | +## Verwenden einer Komponente (2) |
| 101 | + |
| 102 | +```jsx |
| 103 | +import SimpleComponent from "./simple"; |
| 104 | +export default function RootLayout({ |
| 105 | + children, |
| 106 | +}: Readonly<{ |
| 107 | + children: React.ReactNode; |
| 108 | +}>) { |
| 109 | + return ( |
| 110 | + <html lang="de"> |
| 111 | + <body> |
| 112 | + <SimpleComponent></SimpleComponent> |
| 113 | + </body> |
| 114 | + </html> |
| 115 | + ); |
| 116 | +} |
| 117 | +
|
| 118 | +``` |
| 119 | + |
| 120 | +## Props und State |
| 121 | + |
| 122 | +- Props sind Eingaben für Komponenten und per Konvention unveränderlich (immutable). |
| 123 | +- State speichert veränderliche Daten innerhalb einer Komponente. Er gibt der Komponente „Gedächtnis“ für Daten, die sich ändern können. |
| 124 | +- In Funktions-Komponenten nutzt man den Hook useState(), um State zu definieren. |
| 125 | + |
| 126 | +## Hooks (1) |
| 127 | + |
| 128 | +[Hooks](https://react.dev/reference/react/hooks) bieten eine mächtige Möglichkeit, Zustand und Nebeneffekte in funktionalen Komponenten zu verwalten. |
| 129 | + |
| 130 | +- sind spezielle Funktionen, die React-Features nutzbar machen. Erkennbar am Präfix "use", z. B.: |
| 131 | + - useState |
| 132 | + - useEffect |
| 133 | + - useContext |
| 134 | + - useRef |
| 135 | + |
| 136 | +- Wichtige Regeln [(Rule of Hooks)](https://react.dev/reference/rules/rules-of-hooks): |
| 137 | + - Only call Hooks at the top level |
| 138 | + - Only call Hooks from React functions |
| 139 | + |
| 140 | +## Hooks (2) |
| 141 | + |
| 142 | +Beispiel ohne Hook: |
| 143 | + |
| 144 | +```jsx |
| 145 | +function Counter() { |
| 146 | + let count = 0; |
| 147 | + return <button onClick={() => count++}>Count: {count}</button>; |
| 148 | +} |
| 149 | +``` |
| 150 | + |
| 151 | +Probleme: |
| 152 | + |
| 153 | +- count wird bei jedem Rendern neu gesetzt |
| 154 | +- React weiß nicht, dass sich etwas geändert hat |
| 155 | +- Keine automatische Neuberechnung des UI |
| 156 | + |
| 157 | +## Hooks (3): useState |
| 158 | + |
| 159 | +- useState ist ein State hook und ermöglicht es einer Komponente, Informationen wie Benutzereingaben zu „speichern“. |
| 160 | +- Beispielsweise kann eine Formular-Komponente den Status verwenden, um den Eingabewert zu speichern, während eine Bildergalerie-Komponente den Status verwenden kann, um den ausgewählten Bildindex zu speichern. |
| 161 | +- useState deklariert eine sogenannte Statusvariable, welche aktualisiert werden kann |
| 162 | + |
| 163 | +```jsx |
| 164 | +function ImageGallery() { |
| 165 | + const [index, setIndex] = useState(0); |
| 166 | + //... |
| 167 | +``` |
| 168 | + |
| 169 | +> [Referenz von react.dev](https://react.dev/reference/react/hooks#state-hooks) |
| 170 | + |
| 171 | +## Hooks (4): useEffect |
| 172 | + |
| 173 | +Effekte sorgen dafür, dass eine React-Komponente mit der „Außenwelt“ sprechen kann. |
| 174 | + |
| 175 | +Die Außenwelt kann zum Beispiel sein: |
| 176 | + |
| 177 | +- eine API im Internet (Daten laden) |
| 178 | +- das Browser-DOM |
| 179 | +- eine andere JavaScript-Bibliothek |
| 180 | + |
| 181 | +Normalerweise kümmert sich React nur um das Darstellen der Oberfläche. |
| 182 | +Mit einem Effekt kann eine Komponente zusätzlich etwas außerhalb von React machen. |
| 183 | + |
| 184 | +```jsx |
| 185 | +function ChatRoom({ roomId }) { |
| 186 | + useEffect(() => { |
| 187 | + const connection = createConnection(roomId); |
| 188 | + connection.connect(); |
| 189 | + return () => connection.disconnect(); |
| 190 | + }, [roomId]); |
| 191 | + // ... |
| 192 | +``` |
| 193 | + |
| 194 | +> [Referenz von react.dev](https://react.dev/reference/react/hooks#effect-hooks) |
| 195 | + |
| 196 | +## Styling mit SASS |
| 197 | + |
| 198 | +- Sass (Syntactically Awesome Stylesheets) ist eine Erweiterung von CSS |
| 199 | +- Erlaubt mehr Struktur, Variablen, verschachtelte Regeln und Funktionen |
| 200 | +- Vorteile: |
| 201 | + - Variablen: Farben, Abstände, Schriftgrößen einmal definieren und überall nutzen |
| 202 | + - Verschachtelung: Styles direkt in Hierarchien schreiben, wie im HTML |
| 203 | + - Mixins & Funktionen: Wiederverwendbare Style-Blöcke erstellen |
| 204 | + - Bessere Struktur: Große Projekte lassen sich leichter organisieren |
| 205 | + - Kompatibel mit CSS-Modulen: SCSS-Dateien können pro Komponente genutzt werden |
| 206 | + |
| 207 | +- `npm install sass` |
| 208 | +- css Dateiendungen in scss umbenennen und Referenzen anpassen |
| 209 | + |
| 210 | +## Styling mit SASS - Beispiel |
| 211 | + |
| 212 | +```scss |
| 213 | +// SCSS |
| 214 | +$primary-color: olive; |
| 215 | +
|
| 216 | +.button { |
| 217 | + background-color: $primary-color; |
| 218 | + &:hover { |
| 219 | + background-color: darken($primary-color, 10%); |
| 220 | + } |
| 221 | +} |
| 222 | +``` |
| 223 | + |
| 224 | +```css |
| 225 | +/* CSS */ |
| 226 | +.button { |
| 227 | + background-color: olive; |
| 228 | +} |
| 229 | +.button:hover { |
| 230 | + background-color: #556b2f; |
| 231 | +} |
| 232 | +``` |
| 233 | + |
| 234 | +# Navigation |
| 235 | + |
| 236 | +## Dateibasiertes Routing |
| 237 | + |
| 238 | +- Next.js nutzt dateibasierte Routen: Dateien im app- bzw. pages-Verzeichnis definieren automatisch URL-Routen. |
| 239 | +- Beispiel: Die Datei app/page.tsx (index-Seite) erzeugt die Route /. Darin exportiert man eine React-Komponente als Standard-Export: |
| 240 | +- Layouts (z.B. app/layout.tsx) definieren gemeinsame UI-Elemente (Header, Footer, etc.) für alle oder mehrere Seiten. Layouts behalten beim Navigieren ihren Zustand bei. |
| 241 | +- Unterordner im app-Verzeichnis erzeugen verschachtelte Routen. Beispiel: app/blog/page.tsx entspricht der Route /blog. |
| 242 | + |
| 243 | +- app/ |
| 244 | + - page.tsx → Route: "/" |
| 245 | + - about/page.tsx → Route: "/about" |
| 246 | + - blog/page.tsx → Route: "/blog" |
| 247 | + |
| 248 | +## Dynamische Routen im dateibasierten Routing |
| 249 | + |
| 250 | +- Ordner oder Dateien mit eckigen Klammern [param] werden dynamische Parameter |
| 251 | + |
| 252 | +- app/ |
| 253 | + - blog/ |
| 254 | + - [id]/page.tsx → Route: "/blog/:id" |
| 255 | + |
| 256 | +```jsx |
| 257 | +// app/blog/[id]/page.tsx |
| 258 | +export default function BlogPost({ params }) { |
| 259 | + return <h1>Beitrag: {params.id}</h1>; |
| 260 | +} |
| 261 | +``` |
| 262 | + |
| 263 | +## Dateien und Ordner aus Routing ausschließen |
| 264 | + |
| 265 | +- Dateien oder Ordner, die mit \_ beginnen, werden nicht als Route veröffentlicht |
| 266 | +- Häufig für Hilfs-Komponenten, Templates oder Layouts |
| 267 | + |
| 268 | +- app/ |
| 269 | + - components/ |
| 270 | + - Button.tsx (nicht über URL erreichbar) |
| 271 | + |
| 272 | +## Navigation zwischen Seiten |
| 273 | + |
| 274 | +- Zur Navigation zwischen Seiten nutzt man in Next.js die Link-Komponente aus next/link. |
| 275 | +- Link erweitert das HTML-a-Tag um clientseitiges Routing und Prefetching (im Hintergrund vorgeladene Links). |
| 276 | + |
| 277 | +```jsx |
| 278 | +import Link from "next/link"; |
| 279 | +
|
| 280 | +export default function Navbar() { |
| 281 | + return ( |
| 282 | + <nav> |
| 283 | + <Link href="/">Start</Link> |
| 284 | + <Link href="/about">Über uns</Link> |
| 285 | + <Link href="/blog/123">Blog-Beitrag</Link> |
| 286 | + </nav> |
| 287 | + ); |
| 288 | +} |
| 289 | +``` |
| 290 | + |
| 291 | +## Navigation programmatisch |
| 292 | + |
| 293 | +- next/link deckt die meisten Routing-Anforderungen ab |
| 294 | +- Wenn dennoch imperativ navigiert werden muss, ist useRouter zu verwenden |
| 295 | + |
| 296 | +```jsx |
| 297 | +import { useRouter } from "next/router"; |
| 298 | +
|
| 299 | +export default function ReadMore() { |
| 300 | + const router = useRouter(); |
| 301 | +
|
| 302 | + return ( |
| 303 | + <button onClick={() => router.push("/about")}> |
| 304 | + Click here to read more |
| 305 | + </button> |
| 306 | + ); |
| 307 | +} |
| 308 | +``` |
| 309 | + |
| 310 | +> [Referenz von nextjs.org](https://nextjs.org/docs/pages/building-your-application/routing/linking-and-navigating) |
0 commit comments