2015-04-22 8 views
13

Problem ist das folgende:Wenn Sie einzelnen Komponenten eindeutige Schlüssel zuweisen, ist es in Ordnung, Math.random() zu verwenden, um diese Schlüssel zu generieren?

Ich habe Daten in Form einer Liste von ein paar tausend Elemente. Einige von ihnen sind Duplikate, und es besteht die Möglichkeit, dass Sie dann auch doppelte Schlüssel haben. Weil ich keine wirkliche „ID“ oder irgendetwas haben, die mir die Möglichkeit geben würde, alle Elemente ihrer ID als eindeutige Schlüssel zu geben, ist es in Ordnung, Math.random() stattdessen zu benutzen?

Soweit ich verstanden, werden die Schlüssel in erster Linie verwendet, um reagieren, um die Komponenten zu unterscheiden. Ich denke, soweit ich nicht wirklich etwas mit den Schlüsseln in meinem Code zu tun habe, sollte das gut gehen? Um sicherzustellen, dass es keine doppelte Zahl gibt, kann ich auch zwei mathematische Zufallszahlen miteinander teilen, um einen fast sicher eindeutigen Schlüssel zu erhalten.

Ist das eine gute Praxis? Kann ich das verwenden, ohne sich um irgendetwas kümmern zu müssen?

+0

Sie müssen nur Schlüssel bereitstellen, wenn Sie ein Array von Elementen generieren. Und in diesem Fall können Sie auch den Iterationszähler verwenden. –

+0

Erhöhen Sie einfach eine Zahl wie @FelixKling vorgeschlagen. Es ist kein Risiko und einfach. – WiredPrairie

+1

@FelixKling Dies ist ein schlechter Ratschlag. Verwenden Sie niemals Schleifenindizes als Schlüssel. Der Schlüssel muss eindeutig und konsistent sein. – ffxsam

Antwort

13

Ich denke, dass Ihre Komponente unmount und remount eine neue jedes Mal, wenn es Schlüssel ändert, so für die Leistung Willen mit Math.random() wird suboptimal sein, um es gelinde auszudrücken.

Auch wenn Sie Ihre Liste der Komponenten werden Neuordnen, den Index als Schlüssel nicht sehr hilfreich sein, da entweder reagieren wird nicht in der Lage, nur DOM-Knoten bestehenden zu bewegen und wird stattdessen neu rendern sie müssen, die einmal wieder haben suboptimale Leistung, aber nur in diesem Fall, wenn die Liste neu zu bestellen, so in Ihrem Fall, dass ich für die Verwendung von Index statt Math.random entscheiden würde, vorausgesetzt, dass Sie nicht Ihre Liste neu zu ordnen planen in sowieso.

Wenn Sie beabsichtigen, die Liste neu zu ordnen, dann würde ich eindeutige IDs für Ihre Entitäten erzeugen, wenn es keine vorbestehende eindeutigen Kennungen sind, können Sie verwenden.

Eine schnelle Möglichkeit ids hinzuzufügen, ist nur die Sammlung abzubilden und den Index jedes Element zuweisen, wenn Sie zuerst erhalten (oder erstellen) die Sammlung, z.B.

const myItemsWithIds = myItems.map((item, index) => { ...item, myId: index }); 

Auf diese Weise erhält jedes Element eine eindeutige, statische ID.

+0

Danke. Ich wusste nicht einmal, dass die Entscheidung darüber, ob eine Komponente neu gerendert wird oder nicht, auf ihrem Schlüssel basiert. – Sossenbinder

+0

Laut read eslint ist die Verwendung des Index nicht empfehlenswert: "Es ist eine schlechte Idee, den Array-Index zu verwenden, da er Ihre Elemente nicht eindeutig identifiziert. In Fällen, in denen das Array sortiert ist oder ein Element am Anfang des Array wird der Index geändert, obwohl das Element, das diesen Index darstellt, identisch sein kann. Dies führt zu unnötigen Renderings. " Siehe [no-array-index-key] (https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-array-index-key.md) – fraxture

4

Von react documentation:

Wenn Sie keine stabilen Tasten bieten (von Math.random() zum Beispiel verwendet wird), werden alle Teilbäume werden jedes Mal neu gerendert werden. Indem sie den Benutzern die Wahl geben, den Schlüssel zu wählen, haben sie die Fähigkeit, sich in den Fuß zu schießen.

2

Keys sollten stabil, berechenbar und eindeutig sein. Instabile Schlüssel (wie die von Math.random() erzeugten) verursachen, dass viele Komponenteninstanzen und DOM-Knoten unnötigerweise neu erstellt werden, was zu Leistungseinbußen und verlorenen Zuständen in untergeordneten Komponenten führen kann.

https://facebook.github.io/react/docs/reconciliation.html

4

implementieren Sie einfach den folgenden Code in Ihrer Komponente reagieren ...

constructor(props) { 
    super(props); 

    this.keyCount = 0; 
    this.getKey = this.getKey.bind(this); 
} 

getKey(){ 
    return this.keyCount++; 
} 

... und rufen this.getKey() jedes Mal, wenn Sie wie einen neuen Schlüssel benötigen:

key={this.getKey()} 
Verwandte Themen