...und wie funktioniert diese App?
STEP1:
node.js, bootstrap und sonst erst mal nichts!
STEP2:
Videos schauen und ChatGPT vergleichen und nach und nach ausprobieren ==> Das ist
Tabelle mit fest verdrahteten Werten, welche aber als Test-Daten zufällig erstellt /
produziert werden!
STEP3:
Wenn alles so funktioniert, wie gewünscht, dann lassen Sie ein "build" laufen! ==> es
ensteht dann eine HTML-Datei, eine JS-Date und eine CSS-Datei mit quasi kryptischen
Codierungen.
Nicht entmutigen lassen, nämlich einmal die HTML-Datei in eine PHP-Datei umsetzen,
dann die CSS-Datei in eine lesbare Form bringen; das "schwerste" ist aber die JS-Datei
(Diese hat über 190000 Zeichen!!!; die Hauptsache ist: !es funktioniert!). ...Müssen Sie
nicht machen, aber umbezeichnen in style.css und script.js sollte der Lesbarkeit im
Einfachen genügen.
Hier ist der Quellcode für meine react.js-App:
App.js
- import PaginatedTable from './PaginatedTable';
- import "./App.css";
- function App() {
- return (
- <div>
- <PaginatedTable/>
- </div>
- )
- }
- export default App;
PaginatedTable.js
- import React, { useState, useEffect } from "react";
- const generateRandomName = () => {
- const vorname = ['Anna', 'Ben', 'Clara', 'David', 'Dirk', 'Eva', 'Felix', 'Gina', 'Hannes', 'Ina', 'Jörg', 'Kurt', 'Ludwig', 'Lutz', 'Manfred'];
- const nachname = ['Müller', 'Schmidt', 'Schneider', 'Fischer', 'Weber', 'Maier', 'Mayer', 'Meier', 'Meyer', 'Wagner', 'Becker'];
- const vor = vorname[Math.floor(Math.random() * vorname.length)];
- const nach = nachname[Math.floor(Math.random() * nachname.length)];
- return `${vor} ${nach}`;
- };
- const generateRandomEmail = (name) => {
- const domains = ['t-online.de', 'gmail.com', 'yahoo.com', 'outlook.com', 'web.de', 'gmx.de'];
- const domain = domains[Math.floor(Math.random() * domains.length)];
- const emailName = name.toLowerCase().replace(' ', '.');
- return `${emailName}@${domain}`;
- };
- const generateRandomBirthday = () => {
- const start = new Date(1939, 0, 1).getTime();
- const end = new Date(2000, 0, 1).getTime();
- const randomTime = start + Math.random() * (end - start);
- const date = new Date(randomTime);
- return date.toISOString().split('T')[0]; // Format: YYYY-MM-DD
- };
- const generatePeople = (count) => {
- return Array.from({ length: count }, (_, index) => {
- const name = generateRandomName();
- return {
- id: index + 1,
- name,
- email: generateRandomEmail(name),
- birthday: generateRandomBirthday(),
- };
- });
- };
- const PaginatedTable = () => {
- const [people, setPeople] = useState([]);
- const [currentPage, setCurrentPage] = useState(1);
- const itemsPerPage = 10;
- useEffect(() => {
- setPeople(generatePeople(150)); // z.B. 150 zufällige Personen
- }, []);
- // Pagination Logik
- const totalPages = Math.ceil(people.length / itemsPerPage);
- const currentData = people.slice(
- (currentPage - 1) * itemsPerPage,
- currentPage * itemsPerPage
- );
- // Funktionen zur Navigation
- const goToPage = (page) => {
- const p = Math.max(1, Math.min(page, totalPages));
- setCurrentPage(p);
- };
- return (
- <div className="p-4 max-w-4xl mx-auto">
- <center>
- <h2 className="text-xl font-bold mb-4">Personenliste</h2>
- <table className="w-full border border-gray-300">
- <thead className="bg-gray-100">
- <tr className="bg-gray-200">
- <th className="border p-2">Nr</th>
- <th className="border p-2">Name</th>
- <th className="border p-2">E-Mail</th>
- <th className="border p-2">Geburtstag</th>
- </tr>
- </thead>
- <tbody>
- {currentData.map((person) => (
- <tr key={person.id}>
- <td className="border p-2 text-center">{person.id}</td>
- <td className="border p-2">{person.name}</td>
- <td className="border p-2">{person.email}</td>
- <td className="border p-2">{person.birthday}</td>
- </tr>
- ))}>/li>
- </tbody>
- </table>
- {/* Pagination-Steuerung */}
- <div className="mt-4 flex flex-wrap justify-center gap-2">
- <button
- onClick={() => goToPage(1)}
- disabled={currentPage === 1}
- className="px-3 py-1 border rounded disabled:opacity-50"
- >
- Erster Satz
- </button>
- <button
- onClick={() => goToPage(currentPage - 1)}
- disabled={currentPage === 1}
- className="px-3 py-1 border rounded disabled:opacity-50"
- >
- Zurück
- </button>
- <button onClick={() => goToPage(currentPage - 5)} disabled={currentPage <= 5}>
- « -5
- </button>
-
- Seite {currentPage} von {totalPages}
- <button onClick={() => goToPage(currentPage + 5)} disabled={currentPage + 5 > totalPages}>
- +5 »
- </button>
- <button
- onClick={() => goToPage(currentPage + 1)}
- disabled={currentPage === totalPages}
- className="px-3 py-1 border rounded disabled:opacity-50"
- >
- Weiter
- </button>
- <button
- onClick={() => goToPage(totalPages)}
- disabled={currentPage === totalPages}
- className="px-3 py-1 border rounded disabled:opacity-50"
- >
- Letzter Satz
- </button>
- </div>
-
- </div>
- );
- };
- export default PaginatedTable;
index.js
Version 1
- import React from 'react';
- import ReactDOM from "react-dom/client";
F - import './index.css';
- import App from './App';
- import reportWebVitals from './reportWebVitals';
- const root = ReactDOM.createRoot(document.getElementById("root"));
- root.render(
- <React.StrictMode>
- <App />
- </React.StrictMode>
- );
- // If you want to start measuring performance in your App, pass a function
- // to log results (for example: reportWebVitals(console.log))
- // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
- reportWebVitals();
Version 2 ==> Diese benutze ich meistens...und ist ein wenig kürzer!
- import React, { StrictMode } from "react";
- import { createRoot } from "react-dom/client";
- import './index.css';
- import App from "./App";
- const root = createRoot(document.getElementById("root"));
- root.render(
- <StrictMode>
- <App />
- </StrictMode>
- );
index.js
- .App {
- text-align: center;
- }
- .App-logo {
- height: 40vmin;
- pointer-events: none;
- }
- th {
- background-color: rgb(83, 83, 219);
- }
- tr {
- background-color: cyan;
- }
- tr:nth-child(2n) {
- background-color: yellow;
- }
- tr:hover {
- background-color: #ddd;
- }
package.json
- {
- "name": "test_6",
- "version": "0.1.0",
- "private": true,
- "dependencies": {
- "@testing-library/dom": "^10.4.1",
- "@testing-library/jest-dom": "^6.9.1",
- "@testing-library/react": "^16.3.0",
- "@testing-library/user-event": "^13.5.0",
- "react": "^19.2.0",
- "react-dom": "^19.2.0",
- "react-scripts": "5.0.1",
- "web-vitals": "^2.1.4"
- },
- "scripts": {
- "start": "react-scripts start",
- "test": "react-scripts test",
- "eject": "react-scripts eject"
- },
- "eslintConfig": {
- "extends": [
- "react-app",
- "react-app/jest"
- ]
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- }
- }
...dann geht es mit der Erklärung und dem Prinzip los!!! HINWEIS: Die meisten Befehle und Anweisungen werden im WINDOWS-Bereich getätigt...!
...wie lade ich im Grund erst die node.js/npm/react.js in mein System...!!!
==> Als erstes den Download von node.js auf = https://nodejs.org/en/download/
==> dann die Kontrolle, ob node.js mit welcher aktuellen VersionsNr auf dem System ist = Das wird durch die Eingabe von "node -v npm -v" und "ENTER" im Befehlsterminal! durchgeführt.
==> Das wird durch die Eingabe von "npm install -g create-react-app" wird dir [CRA] "create-react-app" installiert. Hier ist "npm" anstatt "yarn" im Gebrauch..
==> Im Befehls-Terminal geben Sie dann "create-react-app my-app" ein und bestätigen Sie diese Eingabe mit "ENTER", und es passiert was...! Entweder wird ein Fehler ausgeworfen, dass die
Eingabe-Formalität [Sonderzeichen und weitere nicht akzeptiert werden] oder ein "Slash -/-" "dreht" sich. Das iste ein Erfolg. ABER IN DIESEM FALL "PROBIEREN GEHT ÜBER STUDIEREN!"!
==> Daraufhin geben Sie ein weiteres Kommando ein: "cd my-app" und bestätigen Dieses ebenfalls mit "ENTER"! udn Sie erhalten in diesem von Ihnen ausgewähltem Verzeichnis den Inhalt als Liste aus...
==> und von hier aus können Sie projektbezogen dann weitere Module mittels "npm install..." laden.
==> und "npm start" startet dann Ihr derzeit aktuelles Projekt in Ihrem aktuellen Browser!
...wozu dient die "package.json" überhaupt...!!!
Also, in Kürze...! Die "package.json" ist sehr wichtig, weil
==> entweder benötigen Sie Informationen über bestimmte Module von react.js, welche gerade im Projekt genutzt werden und ob diese obsolet oder gerade aktuell sind! oder
==> im Programmierteam soll nach Möglichkeit jede Person wissen, welche Module gerade gefragt sind oder nicht und wie der definierte Prozess nach Kundenwüschen entsprechend umgesetzt wird!
==> und für mich gilt Dieses zu merken: npm install oder für Andere yarn zum Laden bestimmter Module wie im Voraus beim Installieren von react.js und npm geschrieben...
...wird fortgesetzt...
...kann man die internen "node_modules" in einem Verzeichnis mehrfach nutzen ohne den ohnehin Speicher bzw. "AppData/temp" auszureizen...!!!
...und dann tasten wir uns langsam zu react-router-dom, MySQL und Konsorten heran...!!! ==> das kann etwas länger dauern...!
...LINUX dann später, weil die Installation auf diesem System anders ist, aber die node.js- und andere react.js-Befehle sind aber gleich...!!!
Stand: 18.10.2025