Vue.js: comment définir un ID unique pour chaque instance de Composant?

Je veux créer un composant avec Vue.js contenant une étiquette et une entrée. par exemple :

<label for="inputId">Label text</label>
<input id="inputId" type="text" />

Comment puis-je définir un ID unique pour chaque instance de Composant?

Merci.

41
demandé sur PierreB 2016-01-22 19:00:16

5 réponses

Chaque composant a un id unique qui peut être consulté comme this._uid.

<template>
  <div>
    <label :for="id">Label text for {{id}}</label>
    <input :id="id" type="text" />
  </div>
</template>

<script>
export default {
  data () {
    return {
      id: null
    }
  }, 
  mounted () {
    this.id = this._uid
  }
}
</script>

Si vous voulez plus de contrôle sur les ID, vous pouvez par exemple les générer dans un composant parent.

79
répondu zxzak 2017-10-09 15:11:03

Bien que la réponse de zxzak soit géniale; _uid n'est pas une propriété api publiée. Pour sauver un mal de tête au cas où il changerait dans le futur, vous pouvez mettre à jour votre code avec un seul changement avec une solution de plugin comme ci-dessous.

Vue.use({
    install: function(Vue, options) {
        Object.defineProperty(Vue.prototype, "uniqId", {
            get: function uniqId() {
                return this._uid;
            }
        });
    }
});
12
répondu Nihat 2017-04-29 07:25:31

Au point de Nihat (ci-dessus): Evan vous a déconseillé d'utiliser _uid: "la vm _uid est réservée à un usage interne et il est important de la garder privée (et de ne pas s'y fier dans le code utilisateur) afin que nous conservions la flexibilité de changer son comportement pour les futurs cas d'utilisation potentiels. ... Je suggère de générer des uid vous-même [en utilisant un module, un mixin global, etc.]"

En utilisant le mixin suggéré dans ce problème GitHub pour générer L'UID semble être une meilleure approche:

let uuid = 0;

export default {
  beforeCreate() {
    this.uuid = uuid.toString();
    uuid += 1;
  },
};
9
répondu buckthorn 2018-07-31 19:36:38

Dans Vue2, utilisez v-bind.

Dire que j'ai un objet pour un sondage

  <div class="options" v-for="option in poll.body.options">
    <div class="poll-item">
      <label v-bind:for="option._id" v-bind:style="{color: option.color}">{{option.text}}</label>
      <input type="radio" v-model="picked" v-bind:value="option._id" v-bind:id="option._id">
  </div>
  </div>
2
répondu 趙曉明 2017-03-06 23:10:02

Il peut également être réalisé en utilisant ce modèle (vue 2.0 v-bind), alors disons que vous avez une liste d'éléments à parcourir et que vous voulez donner des identifiants dom element uninque.

new Vue({

  el:body,
  data: {
     myElementIds : [1,2,3,4,5,6,8]
   }
})

Html

<div v-for="id in myElementIds">
    <label v-bind:for="id">Label text for {{id}}</label>
    <input v-bind:id="id" type="text" />
<div> 

J'espère que ça aide

-3
répondu pitaside 2017-03-02 17:07:06