uniapp 获取循环元素高度
时间: 2025-06-04 07:27:03 浏览: 27
### 如何在 UniApp 中获取 `v-for` 循环生成的元素高度
在 UniApp 开发过程中,如果需要动态获取通过 `v-for` 渲染出来的 DOM 元素的高度,可以利用 Vue 的生命周期钩子以及原生 API 来实现。以下是具体方法:
#### 使用 `$refs` 和 `onReady` 生命周期
可以通过给每个循环渲染的组件绑定唯一的 `ref` 或者直接操作父容器来访问其内部子节点。
```javascript
<template>
<view>
<!-- 绑定 ref 到外层容器 -->
<view v-for="(item, index) in computedItemList" :key="index" class="item" :ref="'item' + index">
{{ item }}
</view>
</view>
</template>
<script>
export default {
data() {
return {
itemList: [1, 2, 3],
};
},
computed: {
computedItemList() {
// 复杂计算逻辑放在这里
return this.itemList.map((item) => item * 2);
},
},
methods: {
getElementHeight() {
const elements = [];
for (let i = 0; i < this.computedItemList.length; i++) {
const elementRef = this.$refs['item' + i][0]; // 获取当前索引对应的 DOM 节点
if (!elementRef) continue;
uni.createSelectorQuery()
.in(this)
.select(`.item:nth-child(${i + 1})`)
.boundingClientRect(rect => {
console.log('第 ' + (i + 1) + ' 项高度:', rect.height); // 输出每一项的高度
})
.exec();
}
},
},
onReady() {
this.getElementHeight(); // 页面加载完成后调用该函数
},
};
</script>
<style scoped>
.item {
margin-bottom: 10px;
}
</style>
```
上述代码中,使用了以下几个关键点:
- **`$refs`**:Vue 提供的一个属性,用于保存被注册过的引用信息[^1]。
- **`uni.createSelectorQuery()`**:这是小程序端特有的查询接口,能够返回页面上某个选择器的第一个匹配节点的相关信息(如位置、大小等)。它支持链式调用,并且可以在异步回调中拿到所需数据[^2]。
需要注意的是,在某些场景下可能还需要考虑样式未完全应用的情况,因此建议将此类操作放在 `onReady` 钩子里执行,因为此时所有的子组件都已经挂载完毕并完成首次渲染。
---
### 注意事项
当尝试读取动态变化后的尺寸时,请确保这些更新已经反映到视图层面再发起测量请求;否则可能会得到旧的状态值或者不准确的结果。对于这种情况可借助 `nextTick` 方法等待 DOM 更新结束后再做进一步处理。
---
阅读全文
相关推荐


















