DOM要素に対応するvue.jsコンポーネントを見つけるにはどうすればよいですか?
私が持っている場合
element = document.getElementById(id);
JQuery $(element)
と同等のvueメソッドはありますか?
適切な方法は、v-el
ディレクティブを使用して参照することです。その後、this.$$[reference]
を実行できます。
Vueでは、2つの参照が要素とコンポーネントの両方に使用されます。 http://vuejs.org/guide/migration.html#v-el-and-v-ref-replaced
これだけで(「メソッド」のメソッドで):
element = this.$el;
:)
Vue.js 2のVueインスタンス内またはコンポーネント:
this.$el
を使用して、インスタンス/コンポーネントがマウントされたHTMLElementを取得しますHTMLElement
から:
.__vue__
を使用しますvar vueInstance = document.getElementById('app').__vue__;
VNode
という変数にvnode
を含めると、次のことができます。
vnode.Elm
を使用して、VNodeがレンダリングされた要素を取得しますvnode.context
を使用して、VNodeがログインするVueインスタンスを取得しますvnode.componentInstance
を使用して、VNodeが対象とするComponentインスタンスを取得しますソース、文字通り: 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>
DOM要素から開始する場合は、その要素の__vue__
プロパティを確認してください。すべてのVueビューモデル(コンポーネント、v-repeat
使用法によって作成されたVM)にはこのプロパティがあります。
ブラウザの開発者コンソール(少なくともFirefoxおよびChrome)で「要素の検査」機能を使用して、DOMプロパティを表示できます。
お役に立てば幸いです!
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]);
}
}
});
したがって、$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
を記述する必要があります。このアプローチは、より簡潔なものですが、より優れた制御を提供します。
このスニペットを見つけました here 。 __vue__
プロパティが見つかるまでDOMノード階層を上に行くという考え方です。
function getVueFromElement(el) {
while (el) {
if (el.__vue__) {
return el.__vue__
} else {
el = el.parentNode
}
}
}
Chromeの場合:
this.$el
-コンポーネントのルート要素を指しますthis.$refs.<ref name>
+ <div ref="<ref name>" ...
-ネストされた要素を指します????
$el
/$refs
は、 vueライフサイクル の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>