React-Listen & Keys

Wir könnenJavaScripts map()-Methodeverwenden, um Listen zu erstellen.

React-Beispiel

Verwenden Sie die map()-Methode, um über das Array zu iterieren und eine Liste mit Zahlen von 1 bis 5 zu erzeugen:

const numbers = [1, 2, 3, 4, 5]; const listItems = numbers.map((numbers) => <li>{numbers}</li> ); const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <ul>{listItems}</ul> );

Selbst ausprobieren »

Wir können das obige Beispiel in eine Komponente umgestalten. Die Komponente erhält einen Array-Parameter, und jedem Listenelement wird ein Schlüssel zugewiesen, andernfalls erscheint eine Warnungfür Listenelemente sollte ein Schlüssel angegeben werden, was bedeutet, dass ein Schlüssel enthalten sein muss:

React-Beispiel

function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => <li key={number.toString()}> {number} </li> ); return ( <ul>{listItems}</ul> ); } const numbers = [1, 2, 3, 4, 5]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <NumberList numbers={numbers} /> );

Selbst ausprobieren »

Keys

Keys können React dabei helfen zu erkennen, welche Elemente sich geändert haben, wenn bestimmte Elemente im DOM hinzugefügt oder entfernt werden. Daher sollte jedem Element im Array eine stabile Kennung gegeben werden.

const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li key={number.toString()}>
    {number}
  </li>
);

Der Key eines Elements sollte idealerweise eine eindeutige Zeichenkette sein, die das Element in der Liste hat. Normalerweise verwenden wir die id aus den Daten als Key für das Element:

const todoItems = todos.map((todo) =>
  <li key={todo.id}>
    {todo.text}
  </li>
);

Wenn das Element keine stabile id hat, kann man seinen Index in der Sequenz als Key verwenden:

const todoItems = todos.map((todo, index) =>
  // 只有在没有确定的 id 时使用
  <li key={index}>
    {todo.text}
  </li>
);

Wenn die Liste umsortiert werden kann, empfehlen wir nicht, den Index als Key zu verwenden, da dies dazu führen kann, dass das Rendering sehr langsam wird.


Komponenten mit Keys extrahieren

Der Key eines Elements ist nur im Vergleich zu seinen Geschwisterknoten aussagekräftig.

Wenn beispielsweise eine ListItem-Komponente extrahiert wird, sollte der Key an diesem<ListItem />Element belassen werden und nicht am <li>Element innerhalb der ListItem-Komponente.

Falsches Beispiel

function ListItem(props) {
  const value = props.value;
  return (
    // 错啦!你不需要在这里指定key:
    <li key={value.toString()}>
      {value}
    </li>
  );
}

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    //错啦!元素的key应该在这里指定:
    <ListItem value={number} />
  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

const numbers = [1, 2, 3, 4, 5];
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <NumberList numbers={numbers} />
);

Die korrekte Verwendung von Keys

React-Beispiel

function ListItem(props) { //Richtig! Hier ist kein Key erforderlich: return <li>{props.value}</li>; } function NumberList(props) { const numbers = props.numbers; const listItems = numbers.map((number) => //Das stimmt wieder! Der Key sollte im Kontext des Arrays angegeben werden <ListItem key={number.toString()} value={number} /> ); return ( <ul> {listItems} </ul> ); } const numbers = [1, 2, 3, 4, 5]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <NumberList numbers={numbers} /> );

Selbst ausprobieren »

Wenn du Elemente innerhalb der map()-Methode aufrufst, solltest du immer daran denken, jedem Element einen eindeutigen Key hinzuzufügen.


Der Key eines Elements sollte unter seinen Geschwisterelementen eindeutig sein.

Die in Array-Elementen verwendeten Keys sollten unter ihren Geschwisterelementen eindeutig sein. Sie müssen jedoch nicht global eindeutig sein. Wenn wir zwei verschiedene Arrays erzeugen, können wir dieselben Keys verwenden.

React-Beispiel

function Blog(props) { const sidebar = ( <ul> {props.posts.map((post) => <li key={post.id}> {post.title} </li> )} </ul> ); const content = props.posts.map((post) => <div key={post.id}> <h3>{post.title}</h3> <p>{post.content}</p> </div> ); return ( <div> {sidebar} <hr /> {content} </div> ); } const posts = [ {id: 1, title: 'Hallo Welt', content: 'Willkommen beim Lernen von React!'}, {id: 2, title: 'Installation', content: 'Du kannst React von npm installieren.'} ]; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <Blog posts={posts} /> );

Selbst ausprobieren »

Der key dient als Hinweis für React, aber er wird nicht an deine Komponenten weitergegeben. Wenn deine Komponente denselben Wert wie der key benötigt, übergebe ihn als prop:

const content = posts.map((post) =>
  <Post
    key={post.id}
    id={post.id}
    title={post.title} />
);

Im obigen Beispiel kann die Post-Komponente props.id lesen, aber nicht props.key.


Einbetten von map() in JSX

Im obigen Beispiel haben wir eine separate Variable listItems deklariert und sie in JSX eingefügt:

function NumberList(props) {
  const numbers = props.numbers;
  const listItems = numbers.map((number) =>
    <ListItem key={number.toString()}
              value={number} />

  );
  return (
    <ul>
      {listItems}
    </ul>
  );
}

JSX ermöglicht das Einbetten beliebiger Ausdrücke in geschweiften Klammern, daher können wir es in map() so verwenden:

React-Beispiel

function NumberList(props) { const numbers = props.numbers; return ( <ul> {numbers.map((number) => <ListItem key={number.toString()} value={number} /> )} </ul> ); }

Selbst ausprobieren »

Dies kann manchmal Ihren Code klarer machen, aber manchmal kann dieser Stil auch übermäßig verwendet werden. Genau wie in JavaScript bleibt es Ihnen überlassen, zu entscheiden, wann Sie eine Variable zur Lesbarkeit extrahieren. Aber denken Sie daran: Wenn ein map() zu viele Ebenen tief verschachtelt ist, können Sie eine Komponente extrahieren.

Weitere Erweiterungen