Wie finde ich die vue.js-Komponente, die einem DOM-Element entspricht?
Wenn ich habe
element = document.getElementById(id);
Gibt es eine vue-Methode, die der jQuery entspricht
$(element)
Ghigo
Wie finde ich die vue.js-Komponente, die einem DOM-Element entspricht?
Wenn ich habe
element = document.getElementById(id);
Gibt es eine vue-Methode, die der jQuery entspricht
$(element)
Einfach so (in Ihrer Methode in “Methoden”):
element = this.$el;
🙂
Darum geht es in der Frage nicht. Die Frage ist, wenn Sie einen Verweis auf einen Knoten haben, wie können Sie einen Verweis auf die Vue-Komponente erhalten, die ihn gerendert hat, und nicht auf das Stammelement der Komponente. Wenn Sie in der methods
Sie haben bereits einen Verweis auf die Komponente über this
.
– bogdan.mustiata
28. Oktober 2016 um 12:53 Uhr
Der Fragentitel hat mich getäuscht – aber da einige Personen (ebenfalls durch den Fragentitel getäuscht) hier eine Antwort finden, werde ich diese Antwort belassen.
– Kamil Kielczewski
3. April 2017 um 9:59 Uhr
Hinweis für andere: Nach dem Rendern, in meiner Umgebung mit Vue 1.x, this.$el
ist nur ein HTML-Kommentarobjekt, nicht einmal das Stammobjekt.
– peter_the_oak
14. Mai 2018 um 8:58 Uhr
Stellen Sie sicher, dass Sie sich zumindest danach darauf verlassen mounted()
. zum Beispiel auf created()
das ist undefined
– Jossef Harush Kadouri
27. August 2019 um 17:36 Uhr
Dummkopf
Der richtige Weg, dies zu tun, wäre die Verwendung von v-el
Anweisung, ihm eine Referenz zu geben. Dann können Sie tun this.$$[reference]
.
In Vue 2 werden Refs sowohl für Elemente als auch für Komponenten verwendet: http://vuejs.org/guide/migration.html#v-el-and-v-ref-replaced
In Vue 2, die v-el
Direktive scheint es nicht mehr zu geben.
– bogdan.mustiata
28. Oktober 2016 um 12:55 Uhr
In Vue 2 habe ich hinzugefügt ref="myid"
zu den Elementen musste aber in JavaScript mit referenziert werden this.$refs["myid"]
.
– Tom
1. März 2017 um 19:05 Uhr
Eine coole Sache an ref ist, dass es dynamisch definiert werden kann: :ref="'item' + item.id"
. Dies wird jedoch selten erforderlich sein, da in Schleifen definierte Refs automatisch in ein Array this.$refs gelangen[‘combo-inside-loop’][index]
– rosell.dk
23. März 2018 um 11:50 Uhr
acdcjunior
In Vue.js 2 Innerhalb einer Vue-Instanz oder Komponente:
this.$el
um das HTMLElement zu erhalten, in das die Instanz/Komponente gemountet wurdeVon einem HTMLElement
:
.__vue__
aus dem HTMLElement
var vueInstance = document.getElementById('app').__vue__;
Ein … haben VNode
in einer Variablen namens vnode
du kannst:
vnode.elm
um das Element zu erhalten, für das VNode gerendert wurdevnode.context
um das zu bekommen VueComponent Instanz, dass die Komponente von VNode deklariert wurde (dies gibt normalerweise die übergeordnete Komponente zurück, kann Sie aber bei der Verwendung überraschen Schlüssel.vnode.componentInstance
um das zu bekommen Tatsächliche Vue-Komponente Instanz, um die es bei VNode gehtQuelle wörtlich: vue/flow/vnode.js.
Vue.config.productionTip = false; // disable developer version warning
console.log('-------------------')
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('[DIRECTIVE] My Element is:', vnode.elm);
console.log('[DIRECTIVE] My componentInstance is:', vnode.componentInstance);
console.log('[DIRECTIVE] My context is:', vnode.context);
// some properties, such as $el, may take an extra tick to be set, thus you need to...
Vue.nextTick(() => console.log('[DIRECTIVE][AFTER TICK] My context is:', vnode.context.$el))
}
})
new Vue({
el: '#app',
mounted: function() {
console.log('[ROOT] This Vue instance is mounted at element:', this.$el);
console.log('[ROOT] From the element to the Vue instance:', document.getElementById('app').__vue__);
console.log('[ROOT] Vue component instance of my-component:', document.querySelector('input').__vue__);
}
})
<script src="https://unpkg.com/v[email protected]/dist/vue.min.js"></script>
<h1>Open the browser's console</h1>
<div id="app">
<my-component v-customdirective=""></my-component>
</div>
github.com/vuejs/vue/blob/dev/src/core/instance/lifecycle.js Bei einem “Vue” Beispiel vm: vm._vnode = vnode
Damit können Sie den DOM-Knotenbaum, den VNode (VDOM)-Baum und den Vue-Baum überqueren.
– Kleinschrift
18. März 2019 um 2:56 Uhr
wo ist vnode.elm
dokumentiert?
– Meier
21. November 2019 um 14:16 Uhr
was ist der Unterschied zwischen vnode.context und vnode.componentInstance
– Archsx
8. August 2020 um 6:48 Uhr
@Archsx context
ist die Vue-Instanz (die Root-Komponente). componentInstance
ist die Komponenteninstanz (kann die Root-Komponente sein oder auch nicht. Es ist nicht die Root-Komponente, wenn es sich um eine Instanz einer benutzerdefinierten Komponente handelt, die Sie erstellt haben – via Vue.component('my-comp', { ...})
zum Beispiel).
– acdcjunior
9. August 2020 um 18:26 Uhr
@Archsx vielleicht vnode.context.$el
(jsfiddle.net/acdcjunior/9emvr5az/2) ist für Sie von Nutzen. Anscheinend vnode.context
zeigt auf das Element, das die Komponente war erklärt in. Im Falle dieser Geige, der <Child>
wird in der Wurzel deklariert (“slotted” into <Parent>
)
– acdcjunior
13. August 2020 um 18:16 Uhr
Wenn Sie mit einem DOM-Element beginnen, suchen Sie nach a __vue__
Eigenschaft auf diesem Element. Alle Vue View-Modelle (Komponenten, VMs erstellt von v-repeat
Verwendung) wird diese Eigenschaft haben.
Sie können die Funktion “Inspect Element” in der Entwicklerkonsole Ihres Browsers (zumindest in Firefox und Chrome) verwenden, um die DOM-Eigenschaften anzuzeigen.
Ich hoffe, das hilft!
Josef Harush Kadouri
this.$el
– zeigt auf das Wurzelelement der Komponentethis.$refs.<ref name>
+ <div ref="<ref name>" ...
– zeigt auf ein verschachteltes Element💡 benutzen
$el
/$refs
nur nachmounted()
Schritt von vue-Lebenszyklus
<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>
Pablo
Da v-ref keine Direktive mehr ist, sondern ein spezielles Attribut, kann es auch dynamisch definiert werden. Dies ist besonders nützlich in Kombination mit v-for.
Zum Beispiel:
<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>
und in der Vue-Komponente, die Sie verwenden können
var recordingModel = new Vue({
el:'#rec-container',
data:{
items:[]
},
methods:{
play:function(item,e){
// it contains the bound reference
console.log(this.$refs['key'+item.id]);
}
}
});
Jauheni Prakoptschik
Also dachte ich $0.__vue__
funktioniert nicht sehr gut mit HOCs (High Order Components).
// ListItem.vue
<template>
<vm-product-item/>
<template>
Aus der obigen Vorlage, falls vorhanden ListItem
Komponente, das hat ProductItem
wie es root ist, und Sie versuchen es $0.__vue__
in der Konsole wäre das Ergebnis unerwartet die ListItem
Beispiel.
Hier habe ich eine Lösung, um die Komponente der niedrigsten Ebene auszuwählen (ProductItem
in diesem Fall).
// 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__
.Wenn Sie mehr wollen, können Sie einfach verwenden $0.__vue__.$parent
. Das heißt, wenn 3 Komponenten denselben Dom-Knoten teilen, müssen Sie schreiben $0.__vue__.$parent.$parent
um die Hauptkomponente zu erhalten. Dieser Ansatz ist weniger lakonisch, bietet aber eine bessere Kontrolle.
Dazu gibt es meines Wissens keine Möglichkeit.
– Michael
14. November 2014 um 17:57 Uhr
Haben Sie etwas dagegen, meine Antwort zu akzeptieren?
– Dummkopf
17. Oktober 2017 um 10:59 Uhr