Au moment de donner des clés uniques pour les composants, est-il acceptable d'utiliser les Mathématiques.random() pour générer ces clés?
Problème est le suivant:
J'ai des données sous la forme d'une liste de quelques milliers d'éléments. Certains d'entre eux sont des doublons, et il y a peut être la chance d'avoir des doubles de clés ainsi alors.
Parce que je n'ai pas de réel "ID" ou quoi que ce soit qui pourrait me donner l'occasion de donner tous les éléments de leur carte d'identité comme des clés uniques, est-il acceptable d'utiliser Math.random()
à la place?
Que j'ai compris, les touches sont surtout utilisées par réagir à différencier les composants. Je pense aussi loin que je n'ai pas vraiment quelque chose à voir avec les clés dans mon code, cela devrait aller bien? Pour s'assurer qu'il n'y aura pas de numéro en double, je pourrais aussi bien diviser deux math randoms les uns avec les autres pour obtenir un presque certainement clé unique.
Est-ce une bonne pratique? Puis-je l'utiliser sans avoir à vous soucier de quoi que ce soit?
- Vous n'avez qu'à fournir des clés de si vous générez un tableau d'éléments. Et dans ce cas, vous pourriez aussi bien utiliser le compteur d'itération.
- Juste incrémenter un numéro de @FelixKling suggéré. C'est le risque zéro et simple.
- C'est de mauvais conseils. Ne jamais utiliser les indices de boucle que les touches soit. La clé doit être unique et cohérente.
- Yah la raison en est que la clé est censé être un identificateur pour les données qui vont dans l'élément de la liste. Si la clé n'est pas liée aux données d'une certaine façon, de réagir ne peut pas faire de l'optimisation.
Vous devez vous connecter pour publier un commentaire.
Chaque fois qu'un composant clé des changements Réagir auront créer une nouvelle instance de composant plutôt que de mettre à jour l'actuel, donc, pour des raisons de performances à l'aide des Mathématiques.random() sera sous-optimale pour dire le moins.
Aussi, si vous serez la réorganisation de votre liste des composants de toute façon, à l'aide de l'index de clé ne être utile, soit depuis la Réagir conciliateur sera pas en mesure de simplement déplacer les nœuds DOM associées aux composants, il faut re-créer les DOM-nœuds pour chaque élément de la liste, qui, une fois de plus, ont un rendement sous-optimal.
Mais je répète, ce ne sera un problème si vous avez à nouveau la commande de la liste, donc dans votre cas, si vous êtes sûr de ne sera pas la réorganisation de votre liste en aucune façon, vous pouvez utiliser en toute sécurité l'index comme une clé.
Toutefois, si vous avez l'intention de réorganiser la liste (ou juste pour être sûr) alors je voudrais générer des identifiants uniques pour vos entités - si il n'y a pas de pré-existants identificateurs uniques que vous pouvez utiliser.
Un moyen rapide d'ajouter des id est juste une carte de la liste et attribuer à l'index de chaque élément quand vous recevez (ou la création) de la liste.
De cette façon, chaque élément d'obtenir un unique, statique id.
tl;dr Comment choisir une clé pour de nouvelles personnes à trouver cette réponse
Si votre élément de la liste ont un id unique (ou d'autres propriétés uniques)
l'utiliser comme clé de
Si vous pouvez combiner les propriétés de votre élément de la liste à créer une valeur unique, utilisez cette combinaison de touche
Si aucun de ces travaux mais vous pouvez pinky promettre que vous ne re-commander votre liste, vous pouvez utiliser l'index de tableau sous forme de clé, mais vous êtes probablement mieux de l'ajout de votre propre id de la liste des éléments de la liste, est d'abord reçu ou créé (voir ci-dessus)
Mettre en œuvre le code suivant dans votre réagissent composant...
...et d'appeler
this.getKey()
chaque fois que vous besoin d'une nouvelle clé comme:De réagir la documentation:
Clés doit être stable, prévisible et unique. Instable clés (comme ceux produits par les Mathématiques.random()) permet de faire de nombreuses instances de composant et les nœuds DOM inutilement recréé, ce qui peut entraîner une dégradation des performances et de l'état a perdu dans les composants enfants.
https://facebook.github.io/react/docs/reconciliation.html
Non et non.
Permettez-moi d'illustrer cela avec un exemple simple.
Pourquoi je ne peux pas taper plus d'un personnage dans les entrées, demandez-vous?
C'est parce que je suis la cartographie de texte multiples entrées avec les Mathématiques.random() comme clé prop. Chaque fois que je tape un caractère, le onChange prop incendies et le parent du composant changements d'état qui provoque un nouveau rendu. Ce qui signifie en Mathématiques.le hasard est de nouveau appelée pour chaque entrée et chaque nouvelle clé accessoires sont générés.Afin de réagir rend de nouveau les enfants d'Entrée des composants.En d'autres termes chaque fois que vous tapez un caractère réagir crée un nouvel élément d'entrée car la clé prop changé.
En savoir plus sur ce ici
Je pense que c'est pas correct de donner des Mathématiques.random() pour les composants clés, la raison est lors de la génération de nombre aléatoire, il n'est pas garanti de ne pas obtenir le même nombre de nouveau. Il est très possible que le même nombre aléatoire est généré à nouveau pendant le rendu du composant, de Sorte que ce sera un échec.
Certaines personnes diront que si le nombre aléatoire gamme est plus, il est très peu probable que ce nombre ne sera pas généré de nouveau. Oui exact mais vous code peut générer d'alerte tout moment.
L'un des rapide est d'utiliser new Date() qui sera unique.