Comment trouver le composant vue.js correspondant à un élément DOM?
Si j'ai
element = document.getElementById(id);
Existe-t-il une méthode vue équivalente à jQuery $(element)
_?
La bonne façon de faire serait d'utiliser le v-el
directive pour lui donner une référence. Ensuite, vous pouvez faire this.$$[reference]
.
Dans Vue 2 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;
:)
Dans Vue.js 2 Inside a Vue Instance ou Composant :
this.$el
Pour obtenir le HTMLElement auquel l'instance/le composant a été montéD'un HTMLElement
:
.__vue__
À partir de HTMLElement var vueInstance = document.getElementById('app').__vue__;
En ayant un VNode
dans une variable appelée vnode
, vous pouvez:
vnode.Elm
pour obtenir l'élément pour lequel VNode a été renduvnode.context
pour obtenir l'instance Vue à laquelle VNode appartientvnode.componentInstance
pour obtenir l'instance Component à propos de VNodeSource, littéralement: vue/flow/vnode.js .
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/[email protected]/dist/vue.min.js"></script>
<h1>Open the browser's console</h1>
<div id="app">
<my-component v-customdirective=""></my-component>
</div>
Si vous commencez avec un élément DOM, recherchez un __vue__
propriété sur cet élément. Any Vue Voir les modèles (composants, machines virtuelles créées par v-repeat
_ usage) aura cette propriété.
Vous pouvez utiliser la fonctionnalité "Inspecter l'élément" dans la console de développement de votre navigateur (au moins dans Firefox et Chrome) pour afficher les propriétés du DOM.
J'espère que ça t'as aidé!
Puisque v-ref n'est plus une directive, mais un attribut spécial, il peut également être défini de manière dynamique. Ceci est particulièrement utile en combinaison avec v-for.
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 Vue que 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]);
}
}
});
Donc, j'ai pensé $0.__vue__
ne fonctionne pas très bien avec les HOC (composants d'ordre élevé).
// ListItem.vue
<template>
<vm-product-item/>
<template>
Dans le modèle ci-dessus, si vous avez le composant ListItem
, il a comme racine ProductItem
et vous essayez $0.__vue__
dans la console, le résultat inattendu serait l’instance ListItem
.
Ici, j'ai une solution pour sélectionner le composant de niveau le plus bas (ProductItem
dans ce cas).
// DomNodeToComponent.js
export default {
install: (Vue, options) => {
Vue.mixin({
mounted () {
this.$el.__vueComponent__ = this
},
})
},
}
import DomNodeToComponent from'./plugins/DomNodeToComponent/DomNodeToComponent'
Vue.use(DomNodeToComponent)
$0.__vueComponent__
.Si vous 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.
J'ai trouvé cet extrait ici . L'idée est de remonter la hiérarchie des noeuds DOM jusqu'à un __vue__
propriété est trouvée.
function getVueFromElement(el) {
while (el) {
if (el.__vue__) {
return el.__vue__
} else {
el = el.parentNode
}
}
}
En Chrome:
this.$el
- pointe sur l'élément racine du composantthis.$refs.<ref name>
+ <div ref="<ref name>" ...
- pointe sur un élément imbriqué???? utilisez
$el
/$refs
uniquement aprèsmounted()
étape de vue cycle de vie
<template>
<div>
root element
<div ref="childElement">child element</div>
</div>
</template>
<script>
export default {
mounted() {
let rootElement = this.$el;
let childElement = this.$refs.childElement;
console.log(rootElement);
console.log(childElement);
}
}
</script>
<style scoped>
</style>