2016-12-16 29 views
7

Otrzymuję ten błąd, ale definiuję klucz. Oto mój App.js, na który narzeka.Ostrzeżenie o reakcji: Każde dziecko w tablicy lub iteratorze powinno mieć unikalny "klucz". Sprawdź metodę renderowania "App"

import React from 'react'; 
import Relay from 'react-relay'; 
import AccountTable from './AccountTable'; 

class App extends React.Component { 
    render() { 
    return (
     <div> 
     <h1>Account list</h1> 
      {this.props.viewer.accounts.edges.map(edge => 
      <AccountTable key={edge.node.id} account={edge.node} /> 
     )} 
     </div> 
    ); 
    } 
} 

export default Relay.createContainer(App, { 
    fragments: { 
     viewer:() => Relay.QL` 
      fragment on User { 
       accounts(first: 10) { 
        edges { 
         node { 
          ${AccountTable.getFragment('account')} 
         } 
        } 
       } 
      } 
     `, 
    }, 
}); 
+3

bob ross byłby dumny ze swoich kodów górskich. Ale naprawdę powinieneś sprawdzić unikalność twojego pliku edge.node.id. – aaaaaa

+0

Zwykle czekam na kontrolę zdrowego rozsądku. Czy powyższy kod jest 100% źródłem błędu? czy identyfikatory są rzeczywiście unikatowe? może masz kilka undefineds/nulls – azium

+0

Sprawdź, czy masz zduplikowane identyfikatory: 'console.log (this.props.viewer.accounts.edges.map (edge ​​=> edge.node.id))' – sdgluck

Odpowiedz

7

Najprostszym sposobem, aby rozwiązać ten jest oparcie klucz z indeksem mapie:

{this.props.viewer.accounts.edges.map((edge, i) => 
    <AccountTable key={i} account={edge.node} /> 
)} 

Wtedy nie trzeba się martwić o tym, jak wyjątkowa wartość edge.node.id jest. Numer key musi być unikalny tylko w kontekście wszystkich rodzeństwa AccountTable. Nie musi być globalnie wyjątkowy. Indeks działa więc dobrze.

Jednakże, jeśli masz stabilny identyfikator, który jest oparty na obiekcie, jest to oczywiście lepsze.

+0

Zgodnie z dokumentacją dotyczącą reakcji: "Jeśli nie masz stabilnych identyfikatorów dla wyświetlanych elementów, możesz użyć indeksu pozycji jako klucza w ostateczności". Tak więc chciałbym się upewnić, że nie będę w stanie uzyskać stabilnego identyfikatora, zanim to zrobię. Wszelkie sugestie na temat tego frontu, czy jest to po prostu niemożliwe, ponieważ mój węzeł odwołuje się do innego fragmentu? – LoneWolfPR

+0

Cóż, chyba że masz inny identyfikator, może to być Twoja "ostatnia deska ratunku", prawda? –

+0

To na pewno rozwiązuje problem. Zrobię trochę więcej kopania, ale jeśli nie znajdę sposobu na zdobycie identyfikatora obiektu, oznaczy to jako rozwiązanie. Dzięki! – LoneWolfPR