我正在使用Vue.js创建一个组件,并将其插入DOM而没有任何问题。一旦元素在DOM中,我想知道它的渲染高度 - 即,我想得到它的 offsetHeight 。我无法解决如何做到这一点 - 我必须遗漏一些非常明显的东西。这就是我尝试过的:
HTML:
<!-- vue instance -->
<div id="my-app">
<my-component></my-component>
</div>
<!-- component template -->
<template id="my-component">
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet.</h1>
<pre>{{ myheight }}</pre>
</template>
Vue Javascript:
Vue.component('my-component',{
template: '#my-component',
computed: {
myheight: function(){
return this.offsetHeight;
}
}
});
Vue({ el: '#my-app' });
但它不起作用 - 'myheight'最终为空。我认为可能问题是它可能在插入到DOM之前尝试生成计算属性,因此我尝试使用计算属性而不是:
Vue.component('my-component',{
template: '#my-component',
data: function(){
return {
myheight: 999
};
},
ready: function(){
this.myheight = this.offsetHeight;
}
});
同样,它不起作用 - 它什么都不输出 - 我在控制台中没有收到任何错误或警告。
然后,我认为this
可能不是HTMLElement,所以我搜索了Vue文档,发现所有Vue实例都应该有一个$el
属性指向HTMLElement - 或者至少这就是我理解它的方式......所以我尝试在上面两个例子中使用this.$el.offsetHeight
,但是再次没有成功。
有人能指出我正确的方向吗?所有的帮助都表示赞赏......
答案 0 :(得分:6)
看起来问题出在您的模板中。你似乎有一个fragment instance,这意味着你没有一个围绕所有孩子的顶级元素。
所以不是这样,$el
可能不会引用你想要的东西......
<!-- component template -->
<template id="my-component">
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet.</h1>
<pre>{{ myheight }}</pre>
</template>
...您可以将组件包装在父元素中:
<!-- component template -->
<template id="my-component">
<div class="my-component">
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet.</p> <!-- and close the tag correctly -->
<pre>{{ myheight }}</pre>
</div>
</template>
然后您可以使用this.$el.offsetHeight
获取偏移高度:
Vue.component('my-component',{
template: '#my-component',
data: function(){
return {
myheight: 999
};
},
ready: function(){
this.myheight = this.$el.offsetHeight;
}
});
new Vue({ el: '#my-component' });