80 votes

Avertissement de la console: les listes de composants rendues avec v-for doivent avoir des clés explicites

J'ai eu un problème ici, je ne sais pas quel est le problème dans mon code, mais j'ai reçu un avertissement dans ma console, comment puis-je supprimer cet avertissement?

[Vue astuce]: <todo-item v-for="todoItem in todos">: listes de composants rendu avec v-pour explicitement de touches. Voir https://vuejs.org/v2/guide/list.html#key pour plus d'info.
(qui se trouve dans <Root>)

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Vue Tutorial</title>
        <link rel="shortcut icon" href="https://vuejs.org/images/logo.png">
        <script src="scripts/vue.js"></script>
    </head>
    <body>
        <section id="app">
            <p>{{ msg }}</p>
            <p v-bind:title="message">
                Hover your mouse over me for a few seconds to see my dynamically bound title!
            </p>
            <div>
                <p v-if="seen">This text will show or hide if the button was clicked.</p>
                <button type="button" v-on:click="isSeen">{{ isSeenText }}</button>
            </div>
            <ol>
                <li v-for="todo in todos">
                    {{ todo.text }}
                </li>
            </ol>
            <p>Total count: {{ todos.length }}</p>
            <div v-bind:title="reverseMessageText">
                <p>{{ reverseMessageText }}</p>
                <button v-on:click="reverseMessage">Reverse Message</button>
            </div>
            <div>
                <p>Data binding: <strong>{{ nameOfUser }}</strong></p>
                <input type="text" v-model="nameOfUser">
            </div>
            <div>
                <ol>
                    <todo-item v-for="todoItem in todos" v-bind:data="todoItem"></todo-item>
                </ol>
            </div>
        </section>
        <script src="scripts/app.js"></script>
    </body>
</html>

app.js

var appComponent = Vue.component('todo-item', {
    template: '<li>id: {{ data.id }}<br>text: {{ data.text }}</li>',
    props: [
        'data'
    ]
});

new Vue({
    el: '#app',
    data: {
        msg: 'Hello World!',
        message: 'You loaded this page on ' + new Date(),
        seen: true,
        isSeenText: 'Now you don\'t',
        todos: [
            {
                text: 'Learn JavaScript'
            },
            {
                text: 'Learn Vue'
            },
            {
                text: 'Build something awesome'
            }
        ],
        reverseMessageText: 'Hello World from Vue.js!',
        nameOfUser: 'John Rey'
    },
    methods: {
        reverseMessage: function() {
            this.reverseMessageText = this.reverseMessageText.split('').reverse().join('');
        },
        isSeen: function() {
            this.seen = !this.seen;
            this.isSeenText = this.seen ? 'Now you don\'t' : 'Now you see me';
        }
    }
});


console.log

enter image description here

Voici le lien de Vue suggéré ici. Je pense que je n'ai pas d'erreur, je veux résoudre cette mise en garde mais je ne trouve pas où est la cause, d'ailleur je suis newbie Vue.

118voto

Phil Points 48960

La réponse est explicitement mentionné dans les documents liés...

<todo-item v-for="todoItem in todos"
           v-bind:data="todoItem"
           v-bind:key="todoItem.text"></todo-item>

Pour résumer certaines informations dans les commentaires ci-dessous... vous utilisez :key pour laisser le composant de savoir comment identifier les différents éléments. Cela permet de garder une trace des changements de Vue de la réactivité.

C'est mieux d'essayer de lier l' :key uniques d'identification de la propriété de chaque élément. Par exemple, un id.

13voto

Henry Points 117

Ma solution à un problème similaire ressemblait à ceci:

 - <el-radio v-for="option in field.options"> ...
+ <el-radio v-for="(option, index) in field.options" :key="index"> ...
 

Ou en utilisant v-bind syntaxe index :

 + <el-radio v-for="(option, index) in field.options" v-bind:key="index"> ...
 

3voto

Vous pouvez utiliser n'importe quel champ de vos données comme clé. De plus, vous pouvez utiliser l'identifiant par défaut. De plus, vous pouvez définir une "clé" dans vos données comme dans le code ci-dessous:

 Vue.component('task-list', {
template:  `
<div><slot>
    <task v-for="task in tasks" :key="task.key">  {{task.description}}</task>
</slot></div>
`,
data () {
    return {
        tasks: [
                {description:"Go to market", completed:false, key:"asd"},
                {description:"Wake up ", completed:true, key:"rty"},
                {description:"Sleep", completed:false, key:"terw"},
                {description:"Have breakfast", completed:true, key:"jdr"},
        ]
    };
},
});
Vue.component('task', {
   template: `<li><slot></slot></li>`
});
 

À la place de la clé dans le fichier task.key, vous pouvez saisir l'un des noms de champs, y compris l'identifiant masqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X