1
votes

Vue: pourquoi ce simple v-for ne fonctionne pas: les éléments de l'itération s'attendent à avoir des directives 'v-bind: key' vue / require-v-for-key error

J'ai ce composant simple qui a une personne avec des valeurs qu'il doit afficher:

TestFor.vue :

<template>
    <div v-for = "(value, key) in this.person">
        {{key}} : {{value}}
    </div>

</template>


<script scoped>
    export default {
        props: {
            person: {
                firstName: 'Bob',
                lastNmae: 'Andersen',
                age: 27
            }
        }
    }
</script>


4 commentaires

D'une part, le didacticiel vidéo utilise des données , et non des accessoires comme vous


@ kerbH0lz Pourquoi cela fait-il une différence pour v-for ?


autre question, avez-vous vraiment besoin de this.person au lieu de seulement person ?


@Ifaruki Probablement pas, mais dans ma quête pour me débarrasser de l'erreur, je voulais couvrir que ce n'est pas le manque de ceci qui la causait


3 Réponses :


3
votes

Vous devez définir la clé par élément de votre liste. dans votre cas, c'est assez trivial:

<div v-for = "(value, key) in this.person" :key='key'>
  {{key}} : {{value}}
</div>

Sans la clé, Vue est incapable de lier les données aux composants créés avec v-for. L'absence de clé signifie que toute modification de l'objet que vous avez itéré détruirait et recréerait tous les composants enfants, ce qui entraînerait un certain nombre d'effets secondaires indésirables. Une fois la clé définie, lorsque la collection change, vue calculera la clé pour chaque élément, la comparera avec les clés des enfants existants et agira en conséquence.


13 commentaires

@ kerbh0lz - je n'en suis pas sûr - cette exception est lancée par linter et elle est là pour une très bonne raison. Avez-vous des liens pour soutenir cela?


Ne passez pas une chaîne constante à la liaison (: key = "'key'" ), passez la key elle-même: : key = "key" < / code>


Ouais, non, je me suis peut-être trompé ici, je viens de jouer avec jsfiddle.net/n8Lm7x9v/6 et l'utilisation de accessoires ne fonctionne pas alors que l'utilisation de données se passe sans la : clé . J'ai supprimé mon commentaire, désolé;)


@ZedHome : key = 'key' n'est pas : key = "'key'" cependant


@ kerbh0lz Il l'a corrigé.


@ZedHome - Pantalon en feu: stackoverflow.com/posts/62466626/revisions . Ça n'a jamais été là. : P


@parsecer - Je viens de modifier une réponse pour inclure cette raison. :)


J'ai ajouté "vue / require-v-for-key": "off" à package.json et le code d'origine semble fonctionner maintenant. Suis-je bon ou dois-je réactiver cette règle? Cela semble être un ennui sans raison.


@parsecer - Vous êtes mieux avec cette règle en place. Le manque de clé peut vraiment gâcher votre journée, car il peut être assez difficile à déboguer. vuejs.org/v2/guide/list.html#Maintaining-State


Pourriez-vous peut-être ajouter un exemple - le pseudocode serait OK - des effets indésirables? J'ai du mal à comprendre. Par exemple, si je devais changer un firstName ici, rien de mal ne se passerait, car il n'y a pas d'éléments enfants? Mais si le firstName avait des objets JSON imbriqués ou quelque chose, cela casserait les choses?


Comme mentionné dans la documentation, " Il est recommandé de fournir un attribut key avec v-for chaque fois que possible, à moins que le contenu DOM itéré soit simple ou que vous l'ayez intentionnellement en s'appuyant sur le comportement par défaut pour améliorer les performances. "


Si vous modifiez firstName sans la clé, Vue est incapable de dire à quel élément enfant ce changement fait référence, donc il détruira tous les enfants et réitérera à nouveau à travers tous les éléments. Dans ce cas particulier, ce ne serait pas un problème énorme, mais il est toujours préférable d'inclure la clé dans votre itération v-for


Même si vous avez une très bonne raison de ne pas avoir de clé, je ne désactiverais pas le linter global. Au lieu de cela, vous pouvez ajouter un commentaire magique linter en expliquant pourquoi il devrait fonctionner sans la clé. Cependant, il est généralement plus simple de simplement insérer la clé.



3
votes

L'erreur vient de votre règle linter: require-v- for-key

Vous pouvez le corriger, en ajoutant la liaison de clé:

<div v-for = "(value, key) in this.person" :key="key">
   {{key}} : {{value}}
</div>


3 commentaires

Pourquoi cette règle a-t-elle été créée en premier lieu? Quel en est l'avantage? Le lien que vous avez inclus ne l'expliquait pas ...


Il est mentionné dans la documentation: vuejs.org/v2/guide/list.html # Maintaining-State Ces exemples simples fonctionnent très bien sans clé, mais le linter est également utilisé pour en faire une habitude, donc plus tard, vous n'obtiendrez pas d'erreurs difficiles à déboguer.


Merci pour le lien!



2
votes

L'erreur signifie que vous devez lier la propriété key à votre div.

<template>
    <div v-for = "(value, key) in person" :key="key">
        {{key}} : {{value}}
    </div>

</template>


<script scoped>
    export default {
        props: {
            person : {
               type : Object,
               default : function(){

                   return {
                      firstName: 'Bob',
                      lastNmae: 'Andersen',
                      age: 27
                   }
                }
               }
            }
        }
    }
</script>


2 commentaires

Pourquoi l'erreur se produit-elle si selon les documentations elle n'est pas censée se produire ?


Voyez ma réponse. Vous avez un linter configuré pour lancer l'erreur.