2017-10-21 2 views
0

Reagieren erfordert, dass Sie ein eindeutiges key-Attribut für Elemente in einem Array haben. Die React docs empfehlen die Verwendung eines id aus Ihren Daten. Wenn Sie keine id haben, können Sie den Array-Index als "letzten Ausweg" verwenden, mit der Einschränkung, dass die Verwendung eines Index zu Leistungsproblemen führen kann, wenn die Elemente neu geordnet werden können. Ich hatte auch einige ärgerliche Probleme beim Erstellen eines Arrays von Elementen aus mehreren Quellen-Arrays und mehrere Aufrufe an .map(), jeweils mit verschiedenen Transformationen, in welchem ​​Fall die Array-Indizes sowieso nicht eindeutig sein werden.Generieren sequenzieller IDs für ReactJS-Schlüssel

Ich habe angefangen, die folgende Text werfen in meine Komponenten:

constructor(props) { 
    super(props); 
    this.getId = this.getId.bind(this); 
    this.id = 0; 
} 

getId() { 
    return this.id++; 
} 

, die wie so verwendet werden können:

render() { 
    const items = this.props.greetings.map(text => ({ 
     <li key={this.getId()}>{text}</li> 
    })); 

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

Das ist einfach, schnell und hat nicht die Probleme dass die Verwendung des Array-Index hat, aber ich weiß nicht, ob es irgendwelche Probleme mit diesem Ansatz oder bessere Alternativen, die ich übersehen habe. Ist das eine schlechte Übung? Gibt es andere einfache Möglichkeiten zum Generieren key s, die nicht die Array-Indexprobleme haben?

+0

'key' prop muss nicht eine ganze Zahl sein. Sie können eine beliebige Zeichenfolge an Schlüssel übergeben. Also, wenn deine 'text'-Props unter den anderen Geschwister-Komponenten einzigartig sind, kannst du das als' Schlüssel'-Prop übergeben. – bennygenel

+0

@bennygenel dies war ein künstliches Beispiel. Sie können davon ausgehen, dass "Text" nicht eindeutig ist. – mgalgs

Antwort

1

Dies ist, was die Dokumentation auf Reconciliation auf Tasten zu sagen hat

In der Praxis wird einen Schlüssel zu finden, hart in der Regel nicht. Das Element, das Sie anzeigen möchten, hat möglicherweise bereits eine eindeutige ID, sodass der Schlüssel nur aus Ihren Daten stammen kann. Wenn das nicht der Fall ist, können Sie eine neue ID-Eigenschaft zu Ihrem Modell hinzufügen oder einige Teile des Inhalts Hash, um einen Schlüssel zu generieren. Der Schlüssel muss nur unter seinen Geschwistern eindeutig sein und nicht global eindeutig sein. Als letzte Möglichkeit können Sie den Index des Elements im Array als Schlüssel übergeben. Dies kann gut funktionieren, wenn die Artikel nie neu geordnet werden, aber die Reihenfolge der Nachbestellungen gering ist.

Also ich denke, Sie folgen dem vorgeschlagenen Ansatz.

+0

Es scheint, als ob meine Vorgehensweise nicht die Probleme mit langsamer Neuordnung hätte, oder? Ich frage mich, warum die Docs so etwas nicht empfehlen ... Ich schätze, der einzige Nachteil ist das Problem, wenn Sie sich nicht um die Leistung kümmern, die schwer zu rechtfertigen ist ... – mgalgs

+0

Nein, Sie sind vor langsamer Neuanordnung sicher Sie erstellen explizit IDs. Die Dokumente sagen, dass Sie die Array-Indizes als Schlüssel als letzten Ausweg verwenden sollten. Sehen Sie sich eine der Fragen an, die mir aufgefallen sind und zeigt, was passieren könnte. https://stackoverflow.com/questions/46477711/react-error-when-removing-input-component – palsrealm

+0

Um das Boilerplate zu umgehen, können Sie auch eine HOC erstellen, die eine ID-Prop zu jeder Komponente, die Sie möchten, hinzufügen würde in einem Array zu verwenden. Nur ein Gedanke. – palsrealm

Verwandte Themen