如何找到与DOM元素相对应的vue.js组件?
如果我有
element = document.getElementById(id);
是否有一个等效于jQuery的vue方法
$(element)
Answers:
正确的处理方法是使用v-el
指令为其提供引用。那你就可以做this.$$[reference]
。
在Vue 2中,引用用于元素和组件:http : //vuejs.org/guide/migration.html#v-el-and-v-ref-replaced
v-el
指令似乎不再存在。
ref="myid"
了元素,但必须在JavaScript中使用进行引用this.$refs["myid"]
。
:ref="'item' + item.id"
。但是,这很少是必需的,因为在循环中定义的ref会自动进入此数组this。$ refs ['combo-inside-loop'] [index]
只是这样(在您的方法“方法”中):
element = this.$el;
:)
methods
已经通过引用了该组件this
。
this.$el
它只是一个HTML注释对象,甚至不是根对象。
mounted()
。例如,created()
这是undefined
在Vue实例或组件内部的Vue.js 2中:
this.$el
来获取HTML元素的实例/组件被安装到来自HTMLElement
:
.__vue__
从HTMLElement
使用var vueInstance = document.getElementById('app').__vue__;
在VNode
名为的变量中vnode
可以执行以下操作:
vnode.elm
获取渲染VNode的元素vnode.context
得到VueComponent实例VNODE的组件被宣布(这通常返回父成分,但使用时可能会让你大吃一惊插槽。vnode.componentInstance
获取VNode即将涉及的Actual VueComponent实例来源,字面上是: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/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>
vm._vnode = vnode
有了这一点,你可以横走的DOM节点树,这个虚拟节点(虚拟域)树和Vue树。
vnode.elm
记录?
context
是Vue实例(根组件)。componentInstance
是组件实例(可能不是根组件。如果它是您创建的自定义组件的实例(例如,通过)Vue.component('my-comp', { ...})
,则不会是根组件)。
vnode.context.$el
(jsfiddle.net/acdcjunior/9emvr5az/2)。似乎vnode.context
指向在其中声明了组件的元素。在这种提琴的情况下,<Child>
声明在根中(“插入” <Parent>
)
由于v-ref不再是指令,而是特殊属性,因此也可以动态定义它。与v-for结合使用时特别有用。
例如:
<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>
在Vue组件中,您可以使用
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]);
}
}
});
this.$el
-指向组件的根元素this.$refs.<ref name>
+ <div ref="<ref name>" ...
-指向嵌套元素💡仅在vue生命周期步骤之后使用
$el
/$refs
mounted()
<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>
因此,我认为$0.__vue__
在HOC(高阶组件)中效果不佳。
// ListItem.vue
<template>
<vm-product-item/>
<template>
在上面的模板中,如果您有ListItem
组件,ProductItem
它是根目录,并且您$0.__vue__
在控制台中尝试使用,结果将意外ListItem
实例。
在这里,我有一个选择最低级别组件的解决方案(ProductItem
在这种情况下)。
// 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__
。如果您想要更多,可以使用$0.__vue__.$parent
。这意味着如果3个组件共享相同的dom节点,则必须编写$0.__vue__.$parent.$parent
以获取主要组件。这种方法简单易用,但可提供更好的控制。
如果要在具有“ demo” ID的输入上监听事件(即OnClick),则可以使用:
new Vue({
el: '#demo',
data: {
n: 0
},
methods: {
onClick: function (e) {
console.log(e.target.tagName) // "A"
console.log(e.targetVM === this) // true
}
}
})
由于在Vue 2.0中似乎没有可用的解决方案,因此我发现一种干净的解决方案是创建一个vue-id
属性,并将其设置在模板上。然后在created
和beforeDestroy
生命周期这些实例更新全局对象上。
基本上:
created: function() {
this._id = generateUid();
globalRepo[this._id] = this;
},
beforeDestroy: function() {
delete globalRepo[this._id]
},
data: function() {
return {
vueId: this._id
}
}