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

深入理解 uni-app 的 uni.createSelectorQuery()

uni-app 中,uni.createSelectorQuery() 是一个功能强大的 API,用于在页面或组件中查询节点信息、获取节点尺寸和位置、获取可操作组件的上下文等。它在跨平台开发中非常重要,尤其是涉及动态布局、滚动监听或组件操作时。本文将全面讲解其使用方式、注意事项及典型场景。

1、uni.createSelectorQuery() 返回一个 SelectorQuery 对象实例。它本身相当于一个查询器,你可以在它上面链式调用 .select().selectAll().selectViewport() 等方法来选择节点,并通过 .boundingClientRect().scrollOffset().context() 等方法获取节点信息。

  • 核心功能

    1. 找到页面或组件中的节点

    2. 获取节点信息(位置、尺寸、滚动、样式等)

    3. 获取可操作组件的上下文(如 video、canvas、map、live-player)

    4. 支持批量查询

2. NodesRef 对象

SelectorQuery.select()SelectorQuery.selectAll() 返回 NodesRef 对象,用于获取节点的详细信息。

  • 常用方法

    • boundingClientRect(callback):节点的几何信息(位置、尺寸)

    • scrollOffset(callback):节点或 viewport 的滚动位置

    • context(callback):获取节点的可操作 context(VideoContext、CanvasContext 等)

    • fields(object, callback):灵活获取节点的各种属性、样式和 context

    • node(callback):获取 Node 节点实例(目前主要支持 Canvas)

二、常用方法详解

1. .in(component)

用于指定查询范围为某个自定义组件内,否则默认查询仅限当前页面。

const query = uni.createSelectorQuery().in(this); // this 指当前组件实例
query.select('#childBox').boundingClientRect(res => {console.log(res.width, res.height, res.top);
}).exec();

注意事项

  • 支持 App、微信小程序,但支付宝小程序不支持 .in(component)

  • 必须在组件 mounted 或 onReady 生命周期后调用

2. .select(selector).selectAll(selector)

  • select(selector):选中 第一个匹配节点

  • selectAll(selector):选中 所有匹配节点

选择器规则

  • ID 选择器:#the-id

  • class 选择器:.class1.class2

  • 子元素选择器:.parent > .child

  • 后代选择器:.ancestor .descendant

  • 跨自定义组件后代:.ancestor >>> .descendant(H5 暂不支持)

  • 多选择器并集:#a, .b

3. .selectViewport()

选择显示区域,获取页面或 scroll-view 的尺寸与滚动位置:

uni.createSelectorQuery().selectViewport().scrollOffset(res => {console.log("页面滚动距离", res.scrollTop);}).exec();

4. .boundingClientRect(callback)

获取节点几何信息,类似浏览器 DOM 的 getBoundingClientRect

uni.createSelectorQuery().select('#box').boundingClientRect(res => {console.log(res.top, res.left, res.width, res.height);}).exec();
属性类型说明
idString节点 ID
datasetObject节点 dataset
left, right, top, bottomNumber节点边界位置
width, heightNumber节点尺寸

5. .scrollOffset(callback)

获取节点或 viewport 的滚动信息,单位 px:

uni.createSelectorQuery().select('#scrollView').scrollOffset(res => {console.log(res.scrollTop, res.scrollLeft);}).exec();

6. .context(callback)

获取节点上下文对象,用于可操作组件(video、live-player、canvas 等):

uni.createSelectorQuery().select('#video').context(video => {video.play(); // 播放视频}).exec();
  • context = 节点的“遥控器”

  • 普通 <view> 节点调用 context 一般无用

7. .fields(object, callback)

灵活获取节点信息:

view.fields({id: true,dataset: true,size: true,scrollOffset: true,properties: ['value'],computedStyle: ['color', 'font-size'],context: true,node: true
}, data => {console.log(data);
}).exec();
字段类型默认说明
idBooleanfalse是否返回节点 id
datasetBooleanfalse是否返回 dataset
rectBooleanfalse返回布局位置
sizeBooleanfalse返回 width、height
scrollOffsetBooleanfalse返回 scrollTop/scrollLeft
propertiesArray[]返回指定属性值
computedStyleArray[]返回指定样式值
contextBooleanfalse返回节点对应 context
nodeBooleanfalse返回 Node 节点实例(主要 Canvas)

8. .node(callback)

获取 Node 实例,目前主要支持 canvas

uni.createSelectorQuery().select('#myCanvas').node(res => {const canvasNode = res.node;}).exec();

9. .exec(callback)

执行所有请求,按请求顺序返回数组:

const query = uni.createSelectorQuery().in(this);
query.select('#box').boundingClientRect();
query.select('#btn').boundingClientRect();
query.exec(res => {console.log(res[0], res[1]); // 返回结果顺序和查询顺序一致
});

三、使用注意事项

  1. 生命周期:必须在 mounted / onReady 后调用,否则无法获取节点信息

  2. 跨组件查询:使用 .in(component) 指定查询范围

  3. 平台差异

    • 支付宝小程序不支持 .in(component)

    • nvue 不支持 uni.createSelectorQuery(),需使用 weex dom 模块

  4. 节点 ID 唯一性:同页面或组件内 ID 必须唯一,否则可能选不到或选错

四、典型应用场景

  1. 动态布局:获取节点尺寸来计算元素位置,做动画或自适应布局

  2. 滚动监听:获取 scroll-view 或 viewport 的滚动位置,实现懒加载、吸顶导航

  3. 子组件操作:父组件通过 ref + context.in(this) 操作子组件内部可操作组件

  4. Canvas 绘图:通过 .node() 获取 canvas Node 实例,或者 .context() 获取 CanvasContext

  5. 响应式 UI:结合 Vue 的 ref 或响应式数据,动态改变节点大小、颜色、位置

五、总结

uni.createSelectorQuery() 是 uni-app 中 查询节点信息和操作组件的核心 API

  • 节点信息:位置、尺寸、滚动、样式

  • 上下文 context:可操作组件的方法手柄

  • 支持批量查询:一次获取多个节点信息

  • 平台注意事项:支付宝小程序、nvue 有些方法有限制

通俗理解:

  • 节点 = 页面上真实存在的盒子/组件

  • context = 拿到盒子的遥控器

  • ref = Vue 给父组件的钥匙,可以访问子组件实例

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

相关文章:

  • SAP Valuation Category在制造业成本核算中的使用场景与配置方案
  • Easysearch 数据迁移之 INFINI Gateway
  • 云计算-OpenStack 运维开发实战:从 Restful API 到 Python SDK 全场景实现镜像上传、用户创建、云主机部署全流程
  • OpenBMC 中命令模式的深度解析:从原理到实现
  • Flink中的窗口
  • HTML5 Canvas实现数组时钟代码,适用于wordpress侧边栏显示
  • 用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手
  • PyTorch基础(使用TensorFlow架构)
  • Nginx的SSL通配符证书自动续期
  • Python(二):MacBook安装 Python并运行第一个 Python 程序
  • docker搭建java运行环境(java或者springboot)
  • 项目五算:估算、概算、预算、结算、决算
  • 解决:nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module
  • 《张朝阳的物理课》,呼应当下物理学习的“思维转向”
  • react与vue的对比,来实现标签内部类似v-for循环,v-if等功能
  • Avalon-MM协议
  • python之---递归选择文件并生成新文件保持目录结构
  • 《工程封装》(Python)
  • 一键式商品信息获取:京东API返回值深度挖掘
  • Dynamsoft Capture Vision Crack
  • AWS Bedrock Claude模型费用深度分析:企业AI成本优化指南
  • 卫星轨道基础知识
  • ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!
  • LaTeX(排版系统)Texlive(环境)Vscode(编辑器)环境配置与安装
  • Pytest项目_day14(参数化、数据驱动)
  • duiLib 利用布局文件显示一个窗口并响应事件
  • C语言零基础第15讲:字符函数和字符串函数
  • ThinkPHP+Mysql 灵活用工小程序-技术深度解析与实践指南
  • 对线面试官之幂等和去重
  • 数据结构:用数组实现队列(Implementing Queue Using Array)