Élément DOM à vue correspondante.composante js

Comment puis-je trouver la vue.composant js correspondant à un élément DOM?

Si {j'ai[3]}

element = document.getElementById(id);

Existe-t-il une méthode vue équivalente à la jQuery $(element)?

29
demandé sur Ghigo 2014-11-13 20:50:01

9 réponses

La bonne façon de faire avec serait d'utiliser la directive v-el pour lui donner une référence. Ensuite, vous pouvez faire this.$$[reference].

Mise à jour pour vue 2

Dans Vue 2, les références sont utilisées à la fois pour les éléments et les composants: http://vuejs.org/guide/migration.html#v-el-and-v-ref-replaced

34
répondu blockhead 2017-02-08 05:08:13

Juste par ceci (dans votre méthode dans "méthodes"):

element = this.$el;

:)

19
répondu Kamil Kiełczewski 2016-04-11 19:28:46

Si vous commencez avec un élément DOM, recherchez une propriété __vue__ sur cet élément. Tous les Modèles de vue Vue (Composants, Machines Virtuelles créés par v-repeat Utilisation) auront cette propriété.

Vous pouvez utiliser la fonction "Inspect Element" dans la console de développement de votre navigateur (au moins dans Firefox et Chrome) pour afficher les propriétés DOM.

Espérons que cela aide!

8
répondu BigBlueHat 2015-03-03 13:35:05

Puisque v-ref n'est plus une directive, mais un attribut spécial, il peut également être défini dynamiquement. Ceci est particulièrement utile en combinaison avec v-pour.

Par exemple:

<ul>
    <li v-for="(item, key) in items" v-on:click="play(item,$event)">
        <a v-bind:ref="'key' + item.id" v-bind:href="item.url">
            <!-- content -->
        </a>
    </li>
</ul>

Et dans le composant Vue, vous pouvez utiliser

var recordingModel = new Vue({
  el:'#rec-container',
  data:{
    items:[]
  },

  methods:{
    play:function(key,e){
      // it contains the bound reference
      console.log(this.$refs['item'+key]);
    }
  }
});
4
répondu Kathan Shah 2017-10-24 16:19:47

J'ai donc pensé que $0.__vue__ ne fonctionnait pas très bien avec HOCs (composants d'ordre Élevé).

// ListItem.vue
<template>
    <vm-product-item/>
<template>

À partir du modèle ci-dessus, si vous avez un composant ListItem, qui a ProductItem comme racine, et que vous essayez $0.__vue__ dans la console, le résultat serait inopinément l'instance ListItem.

Ici, j'ai une solution pour sélectionner le composant de niveau le plus bas (ProductItem dans ce cas).

Greffon

// DomNodeToComponent.js
export default {
  install: (Vue, options) => {
    Vue.mixin({
      mounted () {
        this.$el.__vueComponent__ = this
      },
    })
  },
}

Installer

import DomNodeToComponent from'./plugins/DomNodeToComponent/DomNodeToComponent'
Vue.use(DomNodeToComponent)

Utiliser

  • dans la console du navigateur, cliquez sur dom élément.
  • Tapez $0.__vueComponent__.
  • faites ce que vous voulez avec le composant. Les données d'accès. Faire des changements. Exécuter des méthodes exposées à partir de e2e.

Fonction Bonus

Si vous en voulez plus, vous pouvez simplement utiliser $0.__vue__.$parent. Ce qui signifie que si 3 composants partagent le même nœud dom, vous devrez écrire $0.__vue__.$parent.$parent pour obtenir le composant principal. Cette approche est moins laconique, mais donne un meilleur contrôle.

2
répondu Yauheni Prakopchyk 2017-11-08 16:41:36

En Vue.js 2 dans une Instance Vueou composant:

  • Utilisez this.$el pour obtenir L'élément HTMLElement sur lequel l'instance/le composant a été monté

À Partir d'un HTMLElement:

  • utiliser .__vue__ à partir de HTMLElement
    • par exemple var vueInstance = document.getElementById('app').__vue__;

Avoir un VNode dans une variable appelée vnode, vous pouvez:

  • Utilisez vnode.elm pour obtenir l'élément auquel VNode a été rendu
  • utilisez vnode.context pour obtenir L'instance Vue que VNode belogs à
  • utilisez vnode.componentInstance pour obtenir l'instancedu composant sur laquelle VNode se trouve

Source, littéralement: vue/flux/vnode.js.

Démo Exécutable:

Vue.component('my-component', {
  template: `<input>`,
  mounted: function() {
    console.log('[my-component] is mounted at element:', this.$el);
  }
});

Vue.directive('customdirective', {
  bind: function (el, binding, vnode) {
    console.log('My Element is:', vnode.elm);
    console.log('My componentInstance is:', vnode.componentInstance);
    console.log('My Vue Instance is:', vnode.context);
  }
})

new Vue({
  el: '#app',
  mounted: function() {
    console.log('This Vue instance is mounted at element:', this.$el);
    
    console.log('From the element to the Vue instance:', document.getElementById('app').__vue__);
    console.log('Vue component instance of my-component:', document.querySelector('input').__vue__);
  }
})
<script src="https://unpkg.com/vue@2.5.15/dist/vue.min.js"></script>

<h1>Open the browser's console</h1>
<div id="app">
  <my-component v-customdirective=""></my-component>
</div>
1
répondu acdcjunior 2018-03-14 22:17:26

Si vous voulez écouter un événement (C'est-à-dire OnClick) sur une entrée avec un id" demo", vous pouvez utiliser:

new Vue({
  el: '#demo',
  data: {
    n: 0
  },
  methods: {
   onClick: function (e) {
     console.log(e.target.tagName) // "A"
     console.log(e.targetVM === this) // true
  }
 }
})
-1
répondu candlejack 2014-11-13 17:58:42

Exactement ce que Kamil a dit,

element = this.$el

Mais assurez-vous que vous n'avez pas instances de fragment.

-4
répondu anonymous 2016-05-09 06:22:48

Comme dans Vue 2.0, aucune solution ne semble disponible, une solution propre que j'ai trouvée est de créer un attribut vue-id, et de le définir également sur le modèle. Ensuite, sur created et beforeDestroy cycle de vie, ces instances sont mises à jour sur l'objet global.

Fondamentalement:

created: function() {
    this._id = generateUid();
    globalRepo[this._id] = this;
},

beforeDestroy: function() {
    delete globalRepo[this._id]
},

data: function() {
    return {
        vueId: this._id
    }
}
-4
répondu bogdan.mustiata 2016-10-28 15:16:15