Skip to content

Commit 725972f

Browse files
committed
addded react
1 parent 44d12b4 commit 725972f

2 files changed

Lines changed: 312 additions & 2 deletions

File tree

Material/Slides/06_Javascript_Clientseitig.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,11 +350,11 @@ console.log(response.status); // -> 404
350350
- Leistungsoptimierung
351351
- Skalierbarkeit
352352

353-
## Angular, React, Vue und Svelte - Gemeinsamkeiten
353+
## Angular, React und Vue - Gemeinsamkeiten
354354

355355
- Komponentenbasierte Architektur: Sie alle nutzen Komponenten als Bausteine für die Benutzeroberfläche
356356
- Reaktivität: Jedes Framework bietet Mechanismen zur automatischen Aktualisierung der Benutzeroberfläche bei Datenänderungen
357-
- Virtual DOM oder ähnliche Optimierungen: Mit Ausnahme von Svelte verwenden alle eine Form des Virtual DOM oder ähnliche Techniken zur Leistungsoptimierung
357+
- Virtual DOM oder ähnliche Optimierungen: alle Frameworks verwenden eine Form des Virtual DOM oder ähnliche Techniken zur Leistungsoptimierung
358358

359359
## Angular - Allgemein
360360

Material/Slides/10_React_Next.md

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
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

Comments
 (0)