É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)?
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
Juste par ceci (dans votre méthode dans "méthodes"):
element = this.$el;
:)
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!
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]);
}
}
});
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.
En Vue.js 2 dans une Instance Vueou composant:
- Utilisez
this.$elpour 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__;
- par exemple
Avoir un VNode dans une variable appelée vnode, vous pouvez:
- Utilisez
vnode.elmpour obtenir l'élément auquel VNode a été rendu - utilisez
vnode.contextpour obtenir L'instance Vue que VNode belogs à - utilisez
vnode.componentInstancepour 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> 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
}
}
})
Exactement ce que Kamil a dit,
element = this.$el
Mais assurez-vous que vous n'avez pas instances de fragment.
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
}
}