如何在Vue.js中获取组件元素的offsetHeight?

时间:2016-04-03 08:54:03

标签: javascript vue.js

我正在使用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,但是再次没有成功。

有人能指出我正确的方向吗?所有的帮助都表示赞赏......

1 个答案:

答案 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' });