diff --git a/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json b/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json index cb0487c..907affe 100644 --- a/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json +++ b/06_react/unterricht/tag40/01_react-app-with-tests/package-lock.json @@ -23,7 +23,7 @@ "@vitest/ui": "^5.0.5", "jsdom": "^30.1.3", "oxlint": "^1.90.0", - "sass-embedded": "^1.107.0", + "sass-embedded": "^1.107.1", "vite": "^8.3.5", "vitest": "^5.0.5" } @@ -2582,9 +2582,9 @@ } }, "node_modules/sass": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.107.0.tgz", - "integrity": "sha512-+whPilvVNoAD57xvdIPLQT0gXo4RD1lHYw+Uw8zYHlojaeaMDxK14tc0JmEsz/XMns48h3lpypisMP+3E8eHQA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.107.1.tgz", + "integrity": "sha512-aJ1/LvxOOb04YhmiBjzZn3jVwdHKol+OVhoMV6fFl02fF9T3i+5Mg9l/CnzqtM+NX5Jn5o3lAbs/ZJivTCLHfQ==", "dev": true, "license": "MIT", "optional": true, @@ -2604,9 +2604,9 @@ } }, "node_modules/sass-embedded": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.107.0.tgz", - "integrity": "sha512-0SWHSg0yNgjZ1Yxw5QYd7fHla1ilqaXEtDyc0VgW+xMjuxsjRmLR7s9+OOCXYqjjNhjT20Oxl6I1+9ylqnw5XQ==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.107.1.tgz", + "integrity": "sha512-DpU0lgDxNE2H7iycTfvvmig1NZ92SqO63D1PPRI8sBniHdpEOzxQno71YRXvEDQgPkaJ7mnljwX16s80AqydaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2625,30 +2625,30 @@ "node": ">=20.19.0" }, "optionalDependencies": { - "sass-embedded-all-unknown": "1.107.0", - "sass-embedded-android-arm": "1.107.0", - "sass-embedded-android-arm64": "1.107.0", - "sass-embedded-android-riscv64": "1.107.0", - "sass-embedded-android-x64": "1.107.0", - "sass-embedded-darwin-arm64": "1.107.0", - "sass-embedded-darwin-x64": "1.107.0", - "sass-embedded-linux-arm": "1.107.0", - "sass-embedded-linux-arm64": "1.107.0", - "sass-embedded-linux-musl-arm": "1.107.0", - "sass-embedded-linux-musl-arm64": "1.107.0", - "sass-embedded-linux-musl-riscv64": "1.107.0", - "sass-embedded-linux-musl-x64": "1.107.0", - "sass-embedded-linux-riscv64": "1.107.0", - "sass-embedded-linux-x64": "1.107.0", - "sass-embedded-unknown-all": "1.107.0", - "sass-embedded-win32-arm64": "1.107.0", - "sass-embedded-win32-x64": "1.107.0" + "sass-embedded-all-unknown": "1.107.1", + "sass-embedded-android-arm": "1.107.1", + "sass-embedded-android-arm64": "1.107.1", + "sass-embedded-android-riscv64": "1.107.1", + "sass-embedded-android-x64": "1.107.1", + "sass-embedded-darwin-arm64": "1.107.1", + "sass-embedded-darwin-x64": "1.107.1", + "sass-embedded-linux-arm": "1.107.1", + "sass-embedded-linux-arm64": "1.107.1", + "sass-embedded-linux-musl-arm": "1.107.1", + "sass-embedded-linux-musl-arm64": "1.107.1", + "sass-embedded-linux-musl-riscv64": "1.107.1", + "sass-embedded-linux-musl-x64": "1.107.1", + "sass-embedded-linux-riscv64": "1.107.1", + "sass-embedded-linux-x64": "1.107.1", + "sass-embedded-unknown-all": "1.107.1", + "sass-embedded-win32-arm64": "1.107.1", + "sass-embedded-win32-x64": "1.107.1" } }, "node_modules/sass-embedded-all-unknown": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.107.0.tgz", - "integrity": "sha512-Vll3OTXluDCFj1p/QZSFZrRR9sUQ+PkZXn8d9MJEz4Zatozkdxy0AhUVvCjODbonl2/r5iSt4gpoZm3OW9e1tA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.107.1.tgz", + "integrity": "sha512-8JVe87KQHSu/uMmcbcRa33AVDdwf0FSCR1tqA9fTaLrsqpgApD2YgqFr7KKCYTNRVSwzqAKdDaD2YJgx/siuVQ==", "cpu": [ "!arm", "!arm64", @@ -2659,13 +2659,13 @@ "license": "MIT", "optional": true, "dependencies": { - "sass": "1.107.0" + "sass": "1.107.1" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.107.0.tgz", - "integrity": "sha512-BIy4QhqOC9ltqdQLKbyJXS4QRpoEQFrQxAizYKkDmgAlb4CsUkcPeW2g7T8lEdRD5CC4TNEF1GWisdc2wCN5Vw==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.107.1.tgz", + "integrity": "sha512-qst7MmgqFwAHjbDN9Z+zjwMqmPM6RGu5ynXJFZmEmkkjCoQQX8DHUZhNCc2bASeLk/wyz1/9RCziUcJ6kn+E5w==", "cpu": [ "arm" ], @@ -2680,9 +2680,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.107.0.tgz", - "integrity": "sha512-khlf9rBiUvWILhOutf5EdApHCf9NtZN0xrPopbrW1vSSlCf84aUJ2L+d/EdgqrBMDpjETc1brjOyOl9j2qP0Rg==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.107.1.tgz", + "integrity": "sha512-tk1uq03Jqba2OuktUuIVQ0eSERB4oCcYiZ88wdzX1edWT/Yc7c4x6ECl2+7zqXec6SGIUDZlI86nurN5fTJLHA==", "cpu": [ "arm64" ], @@ -2697,9 +2697,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.107.0.tgz", - "integrity": "sha512-jaoqQKgEOTQghqApzNZRqMIYhRnGVFndPK7QZFLkS4PBBBNj2EMrpY/jCh4k2ATpk30S1k7EjMbvHW7lJqCl+Q==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.107.1.tgz", + "integrity": "sha512-WzBSIg44+XP15kc+G2qtpfYBm0BtxjuC/X11eEg2L5Ihw45DoBtSLkpkSpLd9tvxDJOiTK3AHd1/iv5oGNvibg==", "cpu": [ "riscv64" ], @@ -2714,9 +2714,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.107.0.tgz", - "integrity": "sha512-0ETPwPcwtX1/eEsBkTat4jSBtintmQmc+N/An8HHfqymRQsdPfxwnk7WpTHMdVXSFkv6DfzkjFlRmZtXTfSsFA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.107.1.tgz", + "integrity": "sha512-K6YN7kqj9aBLmraVDiPIHF7U8qoD9E/6AJIVwj1Y5H0EgPjGOsv1sYu9Uy6SBLvWGg4dsydhbPU7VC+hTGWk9A==", "cpu": [ "x64" ], @@ -2731,9 +2731,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.107.0.tgz", - "integrity": "sha512-apPK51fNRBOdGxpHNp+6X+YTTt6km3bZO3IB/Z987ASaDtdxjQ2U1LP9smbea6GzJpujuxWUuvw/l4vzLN9Y6g==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.107.1.tgz", + "integrity": "sha512-okhyzPI4cLNwa/xRIWbpkRGKmebaNp1+15V5PxVsQbzd8c+dn7eZje2Vf5CWxv9jRZ0nJgM1K/F61Wwb0w8Tyg==", "cpu": [ "arm64" ], @@ -2748,9 +2748,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.107.0.tgz", - "integrity": "sha512-d1U7XHQuQb2iuSf+5NxjMMSt7I9yCYGQw3K4NZd32yf5tuhFMTeyiu3nf0+HvLavD2jAkOiykJtbm+zYnwd5HQ==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.107.1.tgz", + "integrity": "sha512-hMMcxMxTiWoMaCfEvZqofN2l/yW++S0ANdVA3uHbVYO1LeRf9MrOWlOkJCjsbJO5FvfZdKGUxq/hc/5FKX9PXQ==", "cpu": [ "x64" ], @@ -2765,9 +2765,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.107.0.tgz", - "integrity": "sha512-JOk4lk1iYKujZOKXLG1EFWvBxtqN/2mDe6vYw2WJAK1KG1B5Z1l9zRPBXRv+H+YXbObGb8OH6S0AgIvZbBrI0w==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.107.1.tgz", + "integrity": "sha512-k/UIsseDf63xo5qwV1kZgTmJtFlBAKLQf3xb++NmQPv7zvdOZxJ/MVUd1cuDx7vuanVKhM+U6R1mW2GuQxEGHA==", "cpu": [ "arm" ], @@ -2783,9 +2783,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.107.0.tgz", - "integrity": "sha512-HcA2wCqXtcRuGIzS0Qfgk0QQCP9B+57fPWstKozMl/Penl1pXVBA98Ilo64A8wPd2WHYSsY0u5WOAQa3h06IcA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.107.1.tgz", + "integrity": "sha512-cDeuJi63cL2cfr9OZoB2z1jd7Omhdgbj7zBxawZ62NFLe/gYVgeUsHbkB0rh1xbsuMJ9nOu9Mu6bkw8N0XnigQ==", "cpu": [ "arm64" ], @@ -2801,9 +2801,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.107.0.tgz", - "integrity": "sha512-n1ujZwaQzjQ8etH9dm0uOxNkdnIu/bpY0j0TkrWmdCpsqNCob/noyWbuTofZ3whfz2IijHb9d1YAb/CEqDKoig==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.107.1.tgz", + "integrity": "sha512-jshFSmPp7/tq3zV5l7KEDWuZKN6aewTnKMkWzgXN4oiBvRKFWAeQqG2Acn+gjMwtrvY0aRGZxrgreJGwRmFZlg==", "cpu": [ "arm" ], @@ -2819,9 +2819,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.107.0.tgz", - "integrity": "sha512-waH4HH7o0/7uM3M6vp/SisW63JnR2VLU3B7N2sB/+P9C9GLd4ei6X8AzOzemMXDbRSpkM78vFtF9hOOT4HIHjQ==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.107.1.tgz", + "integrity": "sha512-Pr7kApBThIJjKG7FkGIsFvYrhj8aCu7kEuov7WiK3ExUiv5m+Vz8eYzjqIEGGCAyVIGMuuvHCvPmuMUynPZ1CA==", "cpu": [ "arm64" ], @@ -2837,9 +2837,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.107.0.tgz", - "integrity": "sha512-ONS/JfxvUn9KyLIsWH+Q6R0axjhRgtk80jfpOwFltqZBF20lXCEdf9PyoDaE0z+4RebK9D5jHzn8FhciIG9PSA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.107.1.tgz", + "integrity": "sha512-5oJVR7xt0yQnIlW/1Xz+H5Bl2Tix5Gl4qrlrVvUCzfdFUWBwLSZi6KlabjC41UjRisandO3nxHXPZeI1T99krQ==", "cpu": [ "riscv64" ], @@ -2855,9 +2855,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.107.0.tgz", - "integrity": "sha512-iTqvfT21RdnSSF/Fqnlln1gMDF97BfJhabxmz7f3Th0X1YSPX3+XwPLUH1r8RiSIIXcckYGY5adKs/P8iJVgWA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.107.1.tgz", + "integrity": "sha512-ntHvwls0ImF6p9qgZBuIF+BKIZ+6FqrRKZn0JhiFzb48y5o/V0mre6YEmdq8YcYVxPrGaU+Ajk96lpTE7gUC8w==", "cpu": [ "x64" ], @@ -2873,9 +2873,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.107.0.tgz", - "integrity": "sha512-aP3z4aXO7kUR7vwcERe7j6EHVEKJPkC1t8JAJJo9wIintYmUnXKP67Tm5Llfp6r5XhJpUFMjCwrBixtfA43+/Q==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.107.1.tgz", + "integrity": "sha512-m8zLEdUPafxCAXtqx5FgBylIlPaUcb4eBx1lE8ENp/kaqqTMmaapofl+YWFI8xII3id+4rePZBipR142vHnNpQ==", "cpu": [ "riscv64" ], @@ -2891,9 +2891,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.107.0.tgz", - "integrity": "sha512-fhJs/cx2cV8e7wn8ybnjJrWxsLb9YVALksGE1shOJ5fCE1c4H2K6LkcieDK8gKNdqzcihFW8amIoGuMh1fY2yQ==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.107.1.tgz", + "integrity": "sha512-ix29w9TrUrvpzjOir+Ndx3RH5VLJncjq6CMystVUVbx5rpYyyaSzciOm5NKF227ifivhuhWYOFPCkq1NedmXfQ==", "cpu": [ "x64" ], @@ -2909,9 +2909,9 @@ } }, "node_modules/sass-embedded-unknown-all": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.107.0.tgz", - "integrity": "sha512-vjRXQZn8Dek8GqwTZ52vh+YTZLtoH9X8zGcBRKyt5a9yNStoE5N3KXIaeD/2z5jK/Vo9XrsqKJalujugDQnShA==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.107.1.tgz", + "integrity": "sha512-7JKs9q+V/kyVBesAjMa8hXx/qk6/cGKq/7cPSZoAWGu6oHx41wiJVfkZVAYt+fOFRHFXQunIKxIR9ZV7nA63PA==", "dev": true, "license": "MIT", "optional": true, @@ -2922,13 +2922,13 @@ "!win32" ], "dependencies": { - "sass": "1.107.0" + "sass": "1.107.1" } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.107.0.tgz", - "integrity": "sha512-4c8GS5WJcgfDl8ELCqLBw+sNzCMEHhLQ3S8mGp7rxnCcddLmOJwrgPQBPdoOhkWomURzPn8S1BWvUbfgiyAM9A==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.107.1.tgz", + "integrity": "sha512-/DmYPuToDvhsT4Oz1RQuOvQuYFzhcjzAfxjwhRPdWXxGO1OR8+BhbxyXqOUMpMLwgFT9Du3GPjD1yvy8BXnTZQ==", "cpu": [ "arm64" ], @@ -2943,9 +2943,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.107.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.107.0.tgz", - "integrity": "sha512-RJGBevID/0o1bVboKlzvCZkliIJ8I4ETE4jVKiAF673MrAS3ywl69hKeaWE6Ssl1yPlkrepCTqLSJ8tFngY5Zg==", + "version": "1.107.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.107.1.tgz", + "integrity": "sha512-B25UYFtuhnYiqvfLNlJZyDp2xV7T0aT9nueE2w+QhDPM/wCZyeQfj1dgMgq0HYBwEybgx0oLuxomgTqplmQ+eg==", "cpu": [ "x64" ], diff --git a/06_react/unterricht/tag40/01_react-app-with-tests/package.json b/06_react/unterricht/tag40/01_react-app-with-tests/package.json index 205bead..c68e234 100644 --- a/06_react/unterricht/tag40/01_react-app-with-tests/package.json +++ b/06_react/unterricht/tag40/01_react-app-with-tests/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "test": "jest", + "test": "vitest", "test:watch": "vitest --watch", "test:ui": "npx vitest --ui", "dev": "vite", @@ -28,7 +28,7 @@ "@vitest/ui": "^5.0.5", "jsdom": "^30.1.3", "oxlint": "^1.90.0", - "sass-embedded": "^1.107.0", + "sass-embedded": "^1.107.1", "vite": "^8.3.5", "vitest": "^5.0.5" } diff --git a/06_react/unterricht/tag40/01_react-app-with-tests/src/tests/Button.test.jsx b/06_react/unterricht/tag40/01_react-app-with-tests/src/tests/Button.test.jsx index 5af5eb2..033dba0 100644 --- a/06_react/unterricht/tag40/01_react-app-with-tests/src/tests/Button.test.jsx +++ b/06_react/unterricht/tag40/01_react-app-with-tests/src/tests/Button.test.jsx @@ -13,6 +13,7 @@ describe('Button', () => { const button = screen.getByRole('button'); const user = userEvent.setup(); + // expect(button).toHaveTextContent(/click me/i); // fireEvent.click(button); await user.click(button); // simulate click diff --git a/07_js-debug/agenda.md b/07_js-debug/agenda.md index 68510a4..b29e199 100644 --- a/07_js-debug/agenda.md +++ b/07_js-debug/agenda.md @@ -660,14 +660,82 @@ Projektarbeit Übung 20 + --- -### TBA +## JavaScript/TypeScript Debugging & Testing + +-- + +### Tag 46 **Inhalt:** +- inversion, extraction, DRY-Prinzip - Typische Fehlermeldungen: Syntaxfehler, Referenzfehler, TypeError -- Einrichtung von TS, Testing +- Einrichtung von TS - Logische Fehler -- Mocking mit async Data -- Weitere Techniken: Snapshot & Cypress + +**Übungen:** +Projektarbeit + +--- + +### Tag 47 + +**Inhalt:** + +- Debugging-Techniken – Chrome Debugger +- Webentwickler Developer Tools +- Debugging-Techniken – VSCode Debugger + +**Übungen:** +Projektarbeit +Übungen 05 - 14 + +--- + +### Tag 48 + +**Inhalt:** + +- Einführung in Vitest und Unit Testing +- Installieren von Vitest und Schreiben unseres ersten Tests +- Einführung in die React Testing Library +- Unit-Tests in der React-Entwicklung verstehen + +**Übungen:** +Projektarbeit +Übungen 15 - 19 + +--- + +### Tag 49 + +**Inhalt:** + +- Unseren ersten Unit-Test schreiben +- Unit-Tests mit einer Komponentenliste und dem Router schreiben +- Testen von Benutzerverhalten in Unit-Tests +- Performance-Optimierung mit React +- useMemo, React.Memo, useCallback, useRef + +**Übungen:** +Abschluss React Class +Projektarbeit + +--- + +### Tag 50 + +**Inhalt:** + +- useCallback Hook +- React.lazy, Suspense +- Zusammenfassen der React Komponenten +- Wiederholung der Inhalte + +**Übungen:** +Projektarbeit +Übungen 22 - 23 +