Zum Inhalt springen
aviral gupta

// B1.2 · ca. 30 Min. · Einstieg

Props übergeben

Nach dieser Lektion übergeben Sie Daten mit Props von einer Eltern- an eine Kindkomponente und nummerieren das Tic-Tac-Toe-Brett mit einem wiederverwendbaren Square.

Lektion 2 von 5 in B1 Schnellstart

Danach können Sie

  • Werte als JSX-Attribute an ein Kind übergeben: Strings in Anführungszeichen, Zahlen und Objekte in Klammern
  • Props im Kind per Destrukturierung lesen: function Square({ value })
  • Eine Komponente mit anderen Props wiederverwenden, wobei die Daten von den Eltern zum Kind fließen
  1. Aufwärmen · Aufgabe 1 von 7

    Zum Aufwärmen aus Lektion B1.1: Komponenten, JSX und geschweifte Klammern. Welchen Text zeigt Row?

    const game = { player: 'O' };
    
    function Square() {
      return <button className="square">{game.player}</button>;
    }
    
    function Row() {
      return (
        <div className="board-row">
          <Square />
          <Square />
        </div>
      );
    }
  2. Vorhersagen · Aufgabe 2 von 7

    Sagen Sie voraus, bevor Sie weiterlesen. Row schreibt jetzt value="…" auf jedes Square, und Square hat { value } in seinen Klammern. Welchen Text zeigt Row?

    function Square({ value }) {
      return <button className="square">{value}</button>;
    }
    
    function Row() {
      return (
        <div className="board-row">
          <Square value="1" />
          <Square value="2" />
          <Square value="3" />
        </div>
      );
    }
  3. Üben · Aufgabe 3 von 7

    Ergänzen Sie den Parameter so, dass Square das Prop value aus seinen Props nimmt und zeigt.

    function Square(____) {
      return <button className="square">{value}</button>;
    }
    function Square() {
  4. Üben · Aufgabe 4 von 7

    Ordnen Sie jedem Stück Code zu, was es bewirkt.

  5. Üben · Aufgabe 5 von 7

    App übergibt ein Objekt als Prop. Welchen Text zeigt es?

    function Card({ person }) {
      return <p>{person.name} ({person.age})</p>;
    }
    
    function App() {
      return <Card person={{ name: 'Ada', age: 36 }} />;
    }
  6. Denksport · Aufgabe 6 von 7

    Knobelaufgabe. Score addiert 1 zu den Punkten, die es bekommt. Welchen Text zeigt App?

    function Score({ points }) {
      return <p>{points + 1}</p>;
    }
    
    function App() {
      return <Score points="2" />;
    }
  7. Anwenden · Aufgabe 7 von 7

    Mini-Aufgabe: eine Punkteliste. Schreiben Sie in main.jsx eine Komponente Badge, die name und score als Props bekommt und sie in einem <li> mit der Klasse badge zeigt, etwa Ada: 3 points. Der Default-Export Scores rendert ein <ul> mit drei Badges, jedes mit anderem Namen und anderer Punktzahl. Übergeben Sie die Namen als Strings und die Punkte als Zahlen. Führen Sie es aus und prüfen Sie, dass keine Warnung erscheint.

    Prüfen Sie Ihr Ergebnis anhand dieser Liste

Selbst programmieren

Lesen Sie das ausgearbeitete Beispiel und lösen Sie dann die Übungen. Ihr Code läuft in Ihrem Browser oder auf Ihrem Computer und wird nie hochgeladen.

Ausgearbeitetes Beispiel

Neun nummerierte Felder aus einem Square

Das ist das Brett aus dem Tutorial auf react.dev nach "Passing data through props". Square liest ein Prop, value, und zeigt es in seinem Button. Board, die Elternkomponente, rendert Square neunmal und übergibt jedem einen anderen Wert: value="1" bis value="9". Die Felder sind dieselbe Komponente; nur ihre Props unterscheiden sich. styles.css gibt den Feldern ihre Größe; der Runner wendet .css-Dateien selbst auf die Seite an.

main.jsx

function Square({ value }) {
  return <button className="square">{value}</button>;
}

export default function Board() {
  return (
    <>
      <div className="board-row">
        <Square value="1" />
        <Square value="2" />
        <Square value="3" />
      </div>
      <div className="board-row">
        <Square value="4" />
        <Square value="5" />
        <Square value="6" />
      </div>
      <div className="board-row">
        <Square value="7" />
        <Square value="8" />
        <Square value="9" />
      </div>
    </>
  );
}

styles.css

.board-row {
  display: flex;
}

.square {
  width: 2.5rem;
  height: 2.5rem;
  margin: 0 -1px -1px 0;
  border: 1px solid #999;
  background: #fff;
  font-size: 1.5rem;
  font-weight: bold;
}

Ausführen mit

npm run dev

Ausgabe

<!-- #root -->
<div id="root"><div class="board-row"><button class="square">1</button><button class="square">2</button><button class="square">3</button></div><div class="board-row"><button class="square">4</button><button class="square">5</button><button class="square">6</button></div><div class="board-row"><button class="square">7</button><button class="square">8</button><button class="square">9</button></div></div>
  • Jeder Button zeigt den Wert, den sein eigenes <Square>-Tag übergeben hat; die Felder teilen nichts.
  • Der Prop-Name value erscheint nicht im HTML: Props erreichen Ihre Komponente, und nur was sie zurückgibt, kommt auf die Seite.
  • Ohne die Klammern würde <button className="square">value</button> neunmal das Wort value zeigen.
  • Lektion B1.3 macht die Felder mit State anklickbar.
Ändern und ausführen

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser React und den Compiler herunter, der JSX in JavaScript übersetzt (bis zu 2 MB), und speichert beides im Cache. Ihre Komponenten laufen in Ihrem Browser und bleiben auf Ihrem Gerät.

Ihre Seite

Ihre Seite läuft in einem abgeschotteten Rahmen. Sie hat keinen Zugriff auf diese Website, und ihr localStorage liegt nur für diesen Lauf im Speicher: Der nächste Lauf beginnt leer.

Führen Sie das Programm aus, um seine Seite hier zu sehen.

Übungen

Übung 1 von 2

Das Brett mit Props nummerieren

Im Starter zeigt jedes Feld 1. Ändern Sie Square so, dass es ein Prop value liest und zeigt, und Board so, dass es seinen neun Feldern der Reihe nach value="1" bis value="9" übergibt. Lassen Sie export vor Square stehen: Die Tests rendern auch <Square value="7" /> allein.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser React und den Compiler herunter, der JSX in JavaScript übersetzt (bis zu 2 MB), und speichert beides im Cache. Ihre Komponenten laufen in Ihrem Browser und bleiben auf Ihrem Gerät.

Ihre Seite

Ihre Seite läuft in einem abgeschotteten Rahmen. Sie hat keinen Zugriff auf diese Website, und ihr localStorage liegt nur für diesen Lauf im Speicher: Der nächste Lauf beginnt leer.

Führen Sie das Programm aus, um seine Seite hier zu sehen.

Hinweise
  1. Hinweis 1

    Square braucht { value } in seinen Klammern: function Square({ value }).

  2. Hinweis 2

    Zeigen Sie das Prop mit Klammern, {value}; ohne sie zeigt der Button das Wort value.

  3. Hinweis 3

    Schreiben Sie in Board das Prop auf jedes Tag: <Square value="1" />, <Square value="2" /> und so weiter bis 9.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function Square({ value }) {
  return <button className="square">{value}</button>;
}

export default function Board() {
  return (
    <>
      <div className="board-row">
        <Square value="1" />
        <Square value="2" />
        <Square value="3" />
      </div>
      <div className="board-row">
        <Square value="4" />
        <Square value="5" />
        <Square value="6" />
      </div>
      <div className="board-row">
        <Square value="7" />
        <Square value="8" />
        <Square value="9" />
      </div>
    </>
  );
}
Auf dem eigenen Computer ausführen

Installieren Sie React 19.3 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.jsx

export function Square() {
  // TODO: read the value prop and show it.
  return <button className="square">1</button>;
}

export default function Board() {
  // TODO: pass value="1" to value="9" to the nine squares.
  return (
    <>
      <div className="board-row">
        <Square />
        <Square />
        <Square />
      </div>
      <div className="board-row">
        <Square />
        <Square />
        <Square />
      </div>
      <div className="board-row">
        <Square />
        <Square />
        <Square />
      </div>
    </>
  );
}

main.test.jsx

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {render, screen, within} from '@testing-library/react';
import Board, {Square} from './main.jsx';

test('Das Brett zeigt neun Felder mit den Zahlen 1 bis 9', () => {
  render(<Board />);
  const labels = screen.getAllByRole('button').map((button) => button.textContent);
  assert.deepEqual(labels, ['1', '2', '3', '4', '5', '6', '7', '8', '9'], 'die Felder zeigen ' + JSON.stringify(labels));
});

test('Square zeigt den Wert, den es bekommt', () => {
  render(<Square value="7" />);
  const label = screen.getByRole('button').textContent;
  assert.equal(label, '7', '<Square value="7" /> zeigt ' + JSON.stringify(label));
});

test('Die Felder stehen in drei Reihen zu je drei', () => {
  const {container} = render(<Board />);
  const rows = [...container.children];
  assert.equal(rows.length, 3, 'das Brett legt ' + rows.length + ' Element(e) in #root, nicht 3 Reihen');
  rows.forEach((row, i) => {
    const count = within(row).queryAllByRole('button').length;
    assert.equal(count, 3, 'Reihe ' + (i + 1) + ' enthält ' + count + ' Feld(er)');
  });
});

test('React gibt keine Warnungen aus', () => {
  const warnings = [];
  const original = console.error;
  console.error = (...args) => warnings.push(args.join(' '));
  try {
    render(<Board />);
  } finally {
    console.error = original;
  }
  assert.deepEqual(warnings, [], 'console.error beim Rendern');
});

styles.css

.board-row {
  display: flex;
}

.square {
  width: 2.5rem;
  height: 2.5rem;
  margin: 0 -1px -1px 0;
  border: 1px solid #999;
  background: #fff;
  font-size: 1.5rem;
  font-weight: bold;
}

Legen Sie main.jsx in einem Vite-React-Projekt (npm create vite@latest, Vorlage react) als App.jsx in src/ ab und starten Sie es mit npm run dev. React rendert es dort wie hier in <StrictMode>.

Programm ausführen:

npm run dev

Für die Prüfungen gibt es noch keinen Befehl auf Ihrem Computer. Sie stehen in main.test.jsx, geschrieben mit node:test und React Testing Library.

Übung 2 von 2

Eine Punkteanzeige mit Objekt-Props

Player bekommt zwei Props: player, ein Objekt mit name und mark, und score, eine Zahl. Lassen Sie es den Namen, das Zeichen in Klammern und die Punkte zeigen, etwa Ada (X): 3 points. Geben Sie in Scoreboard dem zweiten Player das Objekt { name: 'Grace', mark: 'O' } und die Punktzahl 5. Lassen Sie export vor Player stehen: Die Tests rendern es auch mit anderen Props.

Tab rückt ein, Umschalt+Tab rückt aus. Um den Editor mit der Tastatur zu verlassen, drücken Sie Esc und dann Tab.

Beim ersten Ausführen lädt Ihr Browser React und den Compiler herunter, der JSX in JavaScript übersetzt (bis zu 2 MB), und speichert beides im Cache. Ihre Komponenten laufen in Ihrem Browser und bleiben auf Ihrem Gerät.

Ihre Seite

Ihre Seite läuft in einem abgeschotteten Rahmen. Sie hat keinen Zugriff auf diese Website, und ihr localStorage liegt nur für diesen Lauf im Speicher: Der nächste Lauf beginnt leer.

Führen Sie das Programm aus, um seine Seite hier zu sehen.

Hinweise
  1. Hinweis 1

    Player destrukturiert seine Props schon; lesen Sie player.name, player.mark und score in Klammern.

  2. Hinweis 2

    Schreiben Sie den Text um die Klammern so hin, wie er erscheinen soll: {player.name} ({player.mark}): {score} points.

  3. Hinweis 3

    Für Grace kopieren Sie das Tag von Ada und ändern es: player={{ name: 'Grace', mark: 'O' }} score={5}.

Eine Lösung zeigen

Ein möglicher Lösungsweg. Ihrer kann anders aussehen und trotzdem alle Prüfungen bestehen.

export function Player({ player, score }) {
  return (
    <p className="player">
      {player.name} ({player.mark}): {score} points
    </p>
  );
}

export default function Scoreboard() {
  return (
    <section>
      <h2>Scores</h2>
      <Player player={{ name: 'Ada', mark: 'X' }} score={3} />
      <Player player={{ name: 'Grace', mark: 'O' }} score={5} />
    </section>
  );
}
Auf dem eigenen Computer ausführen

Installieren Sie React 19.3 oder neuer. Speichern Sie diese Dateien in einem Ordner, öffnen Sie dort ein Terminal und führen Sie die Befehle unten aus.

main.jsx

export function Player({ player, score }) {
  // TODO: show the name, the mark in brackets and the score, e.g. Ada (X): 3 points
  return <p className="player">Player</p>;
}

export default function Scoreboard() {
  // TODO: give the second Player Grace, with the mark O and a score of 5.
  return (
    <section>
      <h2>Scores</h2>
      <Player player={{ name: 'Ada', mark: 'X' }} score={3} />
      <Player />
    </section>
  );
}

main.test.jsx

import {test} from 'node:test';
import assert from 'node:assert/strict';
import {render, screen} from '@testing-library/react';
import Scoreboard, {Player} from './main.jsx';

test('Die Anzeige zeigt Ada (X): 3 points', () => {
  render(<Scoreboard />);
  assert.ok(screen.queryByText('Ada (X): 3 points'), 'kein Element zeigt den Text Ada (X): 3 points');
});

test('Die Anzeige zeigt Grace (O): 5 points', () => {
  render(<Scoreboard />);
  assert.ok(screen.queryByText('Grace (O): 5 points'), 'kein Element zeigt den Text Grace (O): 5 points');
});

test('Player zeigt die Props, die es bekommt', () => {
  render(<Player player={{ name: 'Lin', mark: 'O' }} score={0} />);
  assert.ok(screen.queryByText('Lin (O): 0 points'), 'Player mit Lin, O und 0 zeigt nicht Lin (O): 0 points');
});

test('React gibt keine Warnungen aus', () => {
  const warnings = [];
  const original = console.error;
  console.error = (...args) => warnings.push(args.join(' '));
  try {
    render(<Scoreboard />);
  } finally {
    console.error = original;
  }
  assert.deepEqual(warnings, [], 'console.error beim Rendern');
});

Legen Sie main.jsx in einem Vite-React-Projekt (npm create vite@latest, Vorlage react) als App.jsx in src/ ab und starten Sie es mit npm run dev. React rendert es dort wie hier in <StrictMode>.

Programm ausführen:

npm run dev

Für die Prüfungen gibt es noch keinen Befehl auf Ihrem Computer. Sie stehen in main.test.jsx, geschrieben mit node:test und React Testing Library.

Häufige Fehler

Die Klammern um den Prop-Namen vergessen

function Square(value) {
  return <button className="square">{value}</button>;
}

export default function Board() {
  return <Square value="1" />;
}

Was React ausgibt

Objects are not valid as a React child (found: object with keys {value}).

Warum, und die Lösung

React ruft Square mit einem Objekt auf, das alle Props enthält. Ohne Klammern ist der Parameter value dieses ganze Objekt, { value: "1" }, und {value} versucht ein Objekt zu zeigen, was React ablehnt: Der Lauf bricht mit Uncaught Error ab. Destrukturieren Sie das Prop: function Square({ value }).

Eine Zahl ohne Klammern übergeben

function Square({ value }) {
  return <button className="square">{value}</button>;
}

export default function Board() {
  return <Square value=5 />;
}

Was React ausgibt

error TS1145: '{' or JSX element expected.

Warum, und die Lösung

Ein JSX-Attribut nimmt einen String in Anführungszeichen oder einen JavaScript-Wert in Klammern, sonst nichts, deshalb bricht die JSX-Umwandlung mit diesem Fehler ab, und nichts läuft. Schreiben Sie value={5} für die Zahl 5 oder value="5" für den String.

Ein Prop unter anderem Namen lesen

function Profile({ person }) {
  return <h1>{person.name}</h1>;
}

export default function App() {
  return <Profile user={{ name: 'Ada' }} />;
}

Was React ausgibt

TypeError: Cannot read properties of undefined (reading 'name')

Warum, und die Lösung

App übergibt das Prop user, Profile liest aber person. Ein Prop, das nicht übergeben wurde, ist undefined, und undefined hat kein name. Verwenden Sie auf beiden Seiten denselben Namen: <Profile person={…} /> oder function Profile({ user }). Das ist die Formulierung von V8 (Chrome, Node.js); Firefox und Safari formulieren den TypeError anders.

React im Browser: React 19.3.0 (Entwicklungs-Build) und React Testing Library, MIT, von dieser Website ausgeliefert; JSX übersetzt TypeScript 6.0.3, Apache-2.0. Lizenz und Quellcode

Abschlussquiz

5 Fragen, ohne Hinweise. Ab 80 % ist die Lektion abgeschlossen.

Erledigen Sie zuerst alle Aufgaben oben, um das Abschlussquiz freizuschalten.

Problem melden

Etwas ist falsch oder unklar? Beschreiben Sie es kurz, dann wird es geprüft und korrigiert.

#

Mindestens 20 Zeichen.

Nur, wenn Sie eine Antwort wünschen.

Kernideen

Props geben Daten von den Eltern an das Kind

In B1.1 zeigte jedes Square dasselbe. Props ändern das. Die Elternkomponente schreibt Werte auf das Tag des Kindes, wie HTML-Attribute: <Square value="1" />. Jedes solche Attribut ist ein Prop. Das Kind empfängt sie und entscheidet, was es damit macht, zum Beispiel den Wert in seinem Button zeigen. Die Daten fließen in eine Richtung: nach unten, von der Komponente, die das Tag rendert (der Elternkomponente, Board), zu der Komponente, die sie rendert (dem Kind, Square). Ein Kind kann nicht nach oben greifen und ändern, was die Eltern übergeben haben.

Das Kind liest Props per Destrukturierung

React ruft Ihre Komponente mit einem Argument auf: einem Objekt mit allen Props. function Square({ value }) nimmt die Eigenschaft value aus diesem Objekt, value ist also der String "1". Sie können auch function Square(props) schreiben und props.value verwenden; es ist dasselbe Objekt. Fehlen die Klammern, function Square(value), heißt das ganze Objekt value, und wenn Sie es mit {value} zeigen, wirft React einen Fehler. Ein Prop, das die Eltern nicht oder unter anderem Namen übergeben haben, ist im Kind undefined, und {undefined} zeigt nichts.

Strings in Anführungszeichen, alles andere in Klammern

value="1" übergibt den String 1. Jeder andere Wert steht in geschweiften Klammern: score={3} übergibt die Zahl 3, player={player} ein Objekt, und player={{ name: 'Ada' }} schreibt das Objekt direkt hin (die äußeren Klammern wechseln zu JavaScript, die inneren sind das Objekt). value=5 ohne Klammern lässt sich nicht übersetzen. Weil jedes Tag eigene Props bekommt, kann ein Square neun verschiedene Werte zeigen. Lektion B2.3 ergänzt children, Standardwerte und warum eine Komponente ihre Props nicht ändern darf.

Quellen

Zuletzt geprüft am 5. Oktober 2026