当前位置: 首页 > news >正文

小程序中获取元素节点

💡 前言

在 Web 环境中,我们常用以下方式获取 DOM 元素:

document.querySelector()
document.getElementById()
this.$refs.xxx

但在 小程序uni-app 环境中,这些方法统统失效!
因为小程序中没有浏览器 DOM,也不存在 documentwindow 这类全局对象。

👉 换句话说:
小程序没有 DOM 概念,只有“节点信息”或“组件实例”。

✅ 一句话总结

uni-app(包括微信小程序端) 中,要想获取页面元素或组件引用,必须使用 官方提供的节点查询 API:

uni.createSelectorQuery()

或者:

this.$refs + uni.createSelectorQuery().in(this)

🧩 一、使用 uni.createSelectorQuery() 获取节点信息

这是最通用、跨平台(H5 / App / 小程序)都能使用的方式。

📘 示例

<template><view><view id="box" class="my-box">Hello Box</view></view>
</template><script>
export default {mounted() {// 必须在节点渲染完成后(mounted / onReady)执行const query = uni.createSelectorQuery().in(this)query.select('#box').boundingClientRect(data => {console.log('节点信息:', data)/*data = {id: "box",dataset: {},left: 0,right: 375,top: 50,bottom: 150,width: 375,height: 100}*/}).exec()}
}
</script><style>
.my-box {width: 200rpx;height: 100rpx;background-color: pink;
}
</style>

📌 说明

  • uni.createSelectorQuery() 类似于浏览器的 document.querySelector()

  • 但它返回的不是 DOM 节点,而是 节点的布局信息(宽度、高度、坐标等);

  • 查询必须在 节点渲染完成 后执行,否则会返回 null

🧩 二、获取组件实例(类似 Vue 的 $refs

在 uni-app 中,同样支持 Vue 的 ref 属性,但用法略有区别。

📘 示例

<template><view><custom-child ref="childRef"></custom-child><view ref="myView">我是 view 元素</view></view>
</template><script>
export default {mounted() {// ✅ 获取自定义组件实例console.log(this.$refs.childRef) // 输出组件实例// ⚠️ 获取原生节点(view 等)信息,不能直接 this.$refs.myViewconst query = uni.createSelectorQuery().in(this)query.select('#myView').boundingClientRect(res => {console.log('view 节点信息:', res)}).exec()}
}
</script>

📌 要点总结

类型获取方式可否用 $refs说明
自定义组件 <custom-child>this.$refs.xxx✅ 可以返回组件实例
原生节点 <view> / <scroll-view>uni.createSelectorQuery()❌ 不行返回节点信息对象

🧩 三、常见场景示例

1️⃣ 获取滚动条位置

const query = uni.createSelectorQuery().in(this)
query.select('.scroll-view').scrollOffset(res => {console.log('滚动位置:', res.scrollTop)
}).exec()

2️⃣ 获取节点尺寸、坐标

query.select('.item').boundingClientRect(res => {console.log('节点宽高:', res.width, res.height)
}).exec()

🧩 四、常见 API 对比表

功能Web 写法uni-app 对应写法
获取元素document.querySelector()uni.createSelectorQuery()
获取元素尺寸element.getBoundingClientRect().boundingClientRect()
获取滚动偏移element.scrollTop.scrollOffset()
获取组件实例this.$refs.xxx同样可用(仅限自定义组件)
不存在的对象windowdocumentHTMLElement❌ 无法使用

🧩 五、实战示例:滚动到指定元素

<template><scroll-view scroll-y :scroll-top="scrollTop"><view id="target" style="height: 800rpx; background: skyblue;">我是目标区域</view><view style="height: 800rpx; background: pink;"></view></scroll-view><button @click="goToTarget">滚动到目标</button>
</template><script>
export default {data() {return {scrollTop: 0}},methods: {goToTarget() {const query = uni.createSelectorQuery().in(this)query.select('#target').boundingClientRect(res => {this.scrollTop = res.top}).exec()}}
}
</script>

🧩 六、封装一个通用工具函数

为了简化开发,可以封装一个通用的 getElementRect() 函数:

// utils/dom.js
export function getElementRect(ctx, selector) {return new Promise(resolve => {const query = uni.createSelectorQuery().in(ctx)query.select(selector).boundingClientRect(res => {resolve(res)}).exec()})
}

使用示例:

import { getElementRect } from '@/utils/dom.js'export default {async mounted() {const rect = await getElementRect(this, '#myBox')console.log('元素位置与尺寸:', rect)}
}

⚡ 注意事项

  1. 必须等待渲染完成后调用mountedonReady);

  2. 查询链式调用最后必须执行 .exec()

  3. 如果使用 Vue 3 的 <script setup> 语法,可通过 getCurrentInstance() 获取实例:

import { getCurrentInstance } from 'vue'
const { proxy } = getCurrentInstance()
const query = uni.createSelectorQuery().in(proxy)

uni.createSelectorQuery() 在 H5、App、小程序多端兼容。

🎯 总结

场景推荐方法
获取节点宽高、坐标uni.createSelectorQuery().boundingClientRect()
获取滚动位置.scrollOffset()
获取自定义组件实例this.$refs.xxx
组合使用(复杂页面)uni.createSelectorQuery().in(this)

🔁 结语:

在小程序环境中,不能直接操作 DOM。
学会使用 uni.createSelectorQuery() 才是真正理解小程序渲染机制的关键。
它既安全、性能稳定,又能跨多端使用,是替代 Web DOM 操作的核心手段。

http://www.dtcms.com/a/541658.html

相关文章:

  • 山东省聊城建设学校网站《网站开发实践》 实训报告
  • Android Service 的一个细节
  • 【QT】QTimer定时器读取寄存器的值
  • 2025年Java 面试题汇总(含答案解析)
  • 2025年--Lc221--144. 二叉树的前序遍历(递归版)-Java版
  • 生成式AI辅助教学设计的实践探索:从教案生成到教学评价的全流程优化
  • 做网站小程序挣钱吗互联网定制网站
  • 【场景题】List集合去重
  • 最小 k 个数
  • 镇江建网站佛山市城乡住房建设局网站首页
  • LoRA个人理解
  • 网站备案 固定电话做响应网站
  • ROS2系列 (5) : 使用功能包组织C++节点
  • 信创真的能发展的起来吗?
  • 做属于自己公司的网站wordpress微信启动
  • 【教程】Latex简明使用教程
  • 石家庄市建设局网站信息公开免费php网站开发模板
  • 合合肥网站建设威海推广
  • 如何使用 Spring Security 实现细粒度的权限控制?
  • 柯桥教育网站建设深圳南山区网站建设公司
  • 亿赐客网站怎么样北京公司地址推荐
  • 秋招笔记-10.7
  • 2025-10-28 ZYZOJ aoao round 1 hetao1733837的record
  • 在线自助下单网站网站内容包括哪些
  • 企业网站免费模板深圳创意网站建设
  • h5游戏免费下载:弹珠打砖块游戏
  • mysql紧急恢复----gxl
  • 基于springboot的信息化在线教学平台的设计与实现
  • 6.1.3.2 大数据方法论与实践指南-开源大数据实时调度平台(StreamPark)
  • 网站建设mysql数据库电子商务系统的构成