2015-10-31 3 views
6

Ich habe einen zwei Jahre alten Kern von here kopiert. Es arbeitet jetzt mit Figwheel und verwendet eine neuere Version von Reagent/React. Ich bin auf der Suche nach einem generischen Weg zum Isolieren dieser Warnmeldung, die auf die Javascript-Konsole kommt: Warning: Every element in a seq should have a unique :key. Die Idee ist, einen :key mit einem generierten eindeutigen Wert in alle Komponenten zu setzen. Dann sollten die Nachrichten verschwinden und ich werde in der Lage sein zu sehen, welche Komponenten die einzigartige :key benötigt. Mein Problem ist, dass obwohl eine eindeutige :key in alle von ihnen eingefügt wird, die Warnmeldung immer noch gesehen wird.Reagenz Reagieren Clojurescript Warnung: Jedes Element in einem Seq sollte eine eindeutige haben: Schlüssel

Also - könnte mir jemand sagen, welche Komponente ich verpasst habe oder was ich sonst falsch gemacht habe? Wie Sie aus der source (permalink) entnehmen können, habe ich :key (gen-key) zu den beiden Komponenten hinzugefügt: [:polyline {:key (gen-key) ... und [:svg {:key (gen-key) ... in den Zeilen 43 und 68 jeweils.

Bearbeiten Also das ist die answer (permalink), in Bezug auf den Code sowieso. Suchen Sie einfach nach der Platzierung von ^{:key (gen-key)} in den Zeilen 44 und 60.

Beachten Sie, dass die Funktion gen-key zum Debuggen gemacht wurde. Natürliche Schlüssel ersetzen.

Dies ist, wie Sie gen-key implementieren könnte:

(defn gen-key [] 
    (gensym "key-")) 

hier ist und die in den Links getan Weg oben:

(def uniqkey (atom 0)) 
(defn gen-key [] 
    (let [res (swap! uniqkey inc)] 
    (u/log res) 
    res)) 

Antwort

10

Aus dem Beispiel an dem Reagent Project site

(defn lister [items] 
    [:ul 
    (for [item items] 
    ^{:key item} [:li "Item " item])]) 

(defn lister-user [] 
    [:div 
    "Here is a list:" 
    [lister (range 3)]]) 

Hinweis: Die^{: key item} Teil oben ist nicht wirklich notwendig, in diesem einfachen Beispiel, aber einen eindeutigen Schlüssels zur Befestigung Jedes Element in einer dynamisch generierten Liste von Komponenten ist eine gute Methode und hilft Reagieren, um die Leistung für große Listen zu verbessern. Der Schlüssel kann entweder (wie in diesem Beispiel) als Metadaten oder als ein: Schlüsselelement im ersten Argument einer Komponente (wenn es eine Zuordnung ist) gegeben werden. Weitere Informationen finden Sie in der Dokumentation von React.

und die react documentation auf dynamische Kinder sollten Sie in die richtige Richtung zeigen. Auf einer hohen Ebene müssen Sie, wenn Sie Code haben, der in einer Art von Schleife eine Anzahl von ähnlichen Komponenten erzeugt, jeder Komponente die ^{:key val} voranstellen. Da das Reagenz jedoch Dinge in Vektoren benötigt, müssen Sie normalerweise die Ausgabe des Schleifenkonstrukts in einem anderen Vektor wie dem [:ul] im obigen Beispiel oder einem [:div] in einem allgemeinen Fall einbinden.Ich verwende manchmal einen (into [:div] (for ....)) Typ von Konstrukt, um dies zu tun.

+0

Der Code verwendet 'map' anstatt' for' und 'in', aber mit dem gleichen Effekt. Ich habe mit gespielt: Schlüssel entweder als Metadaten oder als erstes Argument für die Komponente. Aber gemäß der Dokumentation * was auch immer * macht keine Chancen. Es gibt viele xy-Punkte in der '[: Polylinie' - die haben keine: Schlüssel - vielleicht ist das das Problem - ich versuche immer noch, es auszuarbeiten ... –

+1

Es muss definitiv als Metadaten nicht das erste Element sein Die Komponente muss also die Form "^ {: key val} [compnent]" haben. Beachten Sie auch, dass das Reagens nicht mit Lazy-Seq-Well arbeitet, weshalb Sie oft Dinge wie '(in [] ...)' oder '(doall ...)' sehen, die verwendet werden, um sicherzustellen, dass der Seq realisiert wird. Stellen Sie sicher, dass das neueste Reagenz als Fehlermeldung etwas besser ist. Scheint sich daran zu erinnern, beim letzten Mal eine reactid zu sehen, die mit dem Fehler referenziert wurde. Vielleicht können Sie den Browser-Inspektor verwenden, um Seitenelemente zu betrachten, um eine Vorstellung davon zu bekommen, welche Komponente verantwortlich ist –

+1

Fram Wiki, das helfen könnte. Insbesondere könnte https://github.com/Day8/re-frame/wiki/Using-%5B%5D-instead-of-%28%29 hilfreich sein, um zu verstehen, wo das Reagens reaktive Komponenten erzeugt, was nicht immer der Fall ist offensichtlich und kann helfen, aufzufinden, wo Sie die Metadaten benötigen –

1

Ich glaube, Sie die Versorgung benötigen: Schlüssel als Metadaten statt, wie z.B

^{:key (gen-key)} [:polyline ... 

Ich denke, es kann nur als MapEintrag für Komponenten hinzugefügt werden, wie Sie hier tun:

[trending-app {:key (gen-key) :state-ref paths-ratom :comms ch}] 

So die oben genannten Arbeiten, aber nicht z.B.

[:svg {:key (gen-key) 
+0

Ich habe versucht, '^ {: key (gen-key)}} für' [: polyline' und '[: svg'. Bisher kein Glück. Auch bei '[trending-app'' muss nichts sein, damit ich das in der Quelle behebe. Kannst du eine Dokumentation als Teil deiner Antwort geben? –

Verwandte Themen