微信小程序(四) 节点查询 | wx.createSelectorQuery

这篇具有很好参考价值的文章主要介绍了微信小程序(四) 节点查询 | wx.createSelectorQuery。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看官方文档给出的说明

查 询 节 点 信 息 的 对 象 , 返 回 一 个 S e l e c t o r Q u e r y 对 象 实 例 \color{#9a2323}{查询节点信息的对象,返回一个 SelectorQuery 对象实例} ,SelectorQuery

拿到实例后再看上边挂载的方法

  • SelectorQuery.in (设置选取范围)
  • SelectorQuery.select (选择节点 | 页面中匹配到的第一个)
  • SelectorQuery.selectAll (选择当前页面下匹配选择器的所有节点)
  • SelectorQuery.selectViewport (获取显示区域的尺寸、滚动位置等信息)
  • SelectorQuery.exec (执行所有的请求,请求结果按请求次序构成数组)

多看文档在微信这里好像不太行的样子
所以还是直接建个demo吧,以一个盒子滑动到顶部吸顶为需求。
实现步骤为通过 wx.createSelectorQuery 获取元素在页面中的高度,页面滑动的时候通过微信提供的 onPageScroll 方法,获取当前页面的滚动高度。到达阈值后 setData

index.wxml
<view id="fixed-content" class="fixed-box {{ isFixed ? 'stick' : '' }}">
  <text>{{ isFixed ? '吸顶啦' : '元素滑动至tab栏时吸顶' }}</text>
</view>
index.js
page({
	onLoad () {
		this.queryFixedElementInfo();
	},
	
  	// 查询吸顶元素高度
	queryFixedElementInfo () {
	  // 获取一个 'SelectorQuery' 实例
	  const query = wx.createSelectorQuery();
	
	  // 选择 id 为 'fixed-content' 的页面元素,查询其布局位置
	  query.select('#fixed-content').boundingClientRect();
	
	  // empty-element 选择的是一个页面并不存在的节点,同样发起一个查询,写在这里只是想提醒下看代码片段的各位,对于不能确定的数据,在取值的时候尽量给个默认值,或者判断数据类型后再进行对应的操作,以免操作不当报错,影响后续的逻辑
	  // 实际应用场景可能为,使用 wx:if 控制的元素,在查询时未渲染
	  query.select('#empty-element').boundingClientRect();
	
	  // 官方注解: '执行所有的请求 ***请求结果按请求次序构成数组*** 在callback的第一个参数中返回。'
	  query.exec(res => {
	    const [ fixedElement, emptyElement ] = res;
	    
	    // 第一项为查询页面节点 '#fixed-content' 的返回值,
	    const { bottom, dataset, height, left, right, top, width } = fixedElement || {};
	    // 查询对象中元素自身的宽高
	    console.log(`%c 查询元素的宽高:${width} * ${height}`, 'color: #282C34');
	    /**
	     * top 为距顶部距离, bottom为元素底部距顶部的距离
	     * 这块可以自己调整元素在界面中的位置
	     * bottom - top === height;
	     * console.log(bottom - top === height); // true
	     */
	    console.log(`%c 查询元素相对视图的边界坐标\n上:${top}\n下:${bottom}\n左:${left}\n右:${right}`, 'color: #a52222');
	    // 查询元素中携带的自定义属性
	    console.dir(dataset);
	
	    // 因为第二条并不存在于页面中,所以也没有返回值,从里边取值的时候记得给个默认值
	    const { id } = emptyElement || {};
	    console.log(`%c 以解构方式取到的值为:${id}, 但是不会报错,需要的话可以在解构的时候赋个默认值`, 'color: red');
	    /** 以下写法会报错,影响后续的业务逻辑  */
	    // console.log(res[1].id || emptyElement.id);
	
	    // do sth...
	    // 记录 '#fixed-content' 距离顶部的距离
	    this.setData({ fixedTop: top });
	  });
	},

	// 页面滑动事件
	onPageScroll (e) {
	  const { scrollTop } = e;
	  const { fixedTop, isFixed } = this.data;
	  if (scrollTop >= fixedTop && !isFixed) {
	    this.setData({ isFixed: true });
	    return;
	  }
	  if (scrollTop < fixedTop && isFixed) {
	    this.setData({ isFixed: false });
	    return;
	  }
	},
}

.select & .selectAll

传入一个选择器,选择器格式参考文档
selector类似于 CSS 的选择器,但仅支持下列语法。
· ID选择器:#the-id
· class选择器(可以连续指定多个):.a-class.another-class
· 子元素选择器:.the-parent > .the-child
· 后代选择器:.the-ancestor .the-descendant
· 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant
· 多选择器的并集:#a-node, .some-other-nodes

.selectViewport

返回一个获取wxml节点信息的对象,包含的方法官方文档有列出
微信官方文档 | NodesRef

.exec

可以看到使用 exec 时如文档所说将所有的请求执行,然后返回结果是一个数组,顺序为发起请求的顺序。
有些条件下可能会出现查询元素并不在界面上的情况,所以对应的返回值为 null,如果这时直接以对象的方式去取值,则会报错,影响后续代码的执行。所以在使用时请记得考虑为空的情况

————————手动的分割线—————————————————————————

Last

其实开始是想把 wx.createSelectorQuerywx.createIntersectionObserver 放在一起,弄个代码片段贴上来就好,不做细分了,但是想了下对初接触的可能不太友好,所以在blog里拆开。这里再挂上揉在一起的小程序代码片段吧,可以对比或者调试,这样可能更方便去理解这个东西

微信开发者工具 | 代码片段地址文章来源地址https://www.toymoban.com/news/detail-502594.html

到了这里,关于微信小程序(四) 节点查询 | wx.createSelectorQuery的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序 wx:if使用

    在微信小程序中,可以使用 wx:if 指令来控制某个元素是否需要被渲染到页面上。根据条件表达式的结果, wx:if 指令决定元素是否显示。 下面是使用 wx:if 的基本示例: 在上述代码中, wx:if 指令的值为一个条件表达式 {{condition}} ,根据该条件表达式的结果决定是否渲染 view 元

    2024年02月09日
    浏览(50)
  • 微信小程序-支付(wx.requestPayment)

    (学习中,持续更新) 直接调用的接口为wx.requestPayment(小程序前端调用)。 官方文档的请求例子为: 其中paySign官方文档给出了一个例子: MD5(appId=wxd678efh567hg6787nonceStr=5K8264ILTKCH16CQ2502SI8ZNMTM67VSpackage=prepay_id=wx2017033010242291fcfe0db70013231072signType=MD5timeStamp=1490840662key=qazwsxedcrfvtg

    2024年02月12日
    浏览(37)
  • 微信小程序本地存储(wx.setStorage)和(wx.setStorageSync)

     在微信小程序中,可以使用本地存储来保存一些数据比如用户状态,姓名,性别等; 本地存储主要包括两种方式:缓存和本地数据存储。 缓存 缓存是一种快速访问内存的临时存储机制,可以有效地提高应用程序的响应速度。在微信小程序中,可以使用 wx.setStorage 方法和

    2023年04月18日
    浏览(95)
  • 微信小程序如何实现兼容----wx.getSystemInfoSync、 wx.getSystemInfo、wx.canIUse

    小程序的宿主环境一直在迭代更新,提供更多的能力给开发者去完成更多的事情,所以你的小程序会运行在不同版本的宿主环境下。为了让你的小程序在不同环境下都能提供相应的服务,我们需要来了解一下在小程序中如何实现兼容办法。 1.针对不同手机进行程序上的兼容

    2024年02月09日
    浏览(49)
  • 微信小程序wx:for 的使用以及wx:key绑定

    wx:for基本使用 wx:for-item和wx:for-index重新命名item和index wx:key两种绑定方式以及注意事项 wx:for基本使用 业务层数据 视图层 wx:for遍历时候每一项名称为 item 每一项索引名称为 index wx:for-item和wx:for-index实现item和index重命名 wx:for-item=\\\"str\\\" 将原来名称 item 修改成 str wx:for-index=\\\"i 将原来

    2024年02月11日
    浏览(78)
  • 【微信小程序】列表渲染wx:for

    🏆今日学习目标:第十二期——列表渲染wx:for 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:20分钟 🎉专栏系列:我的第一个微信小程序 哈喽大家好,本期是微信小程序专栏第十二期,本期我们将学习列表渲染wx:for。 注意:每期内容是连载呢,建议大家

    2024年02月08日
    浏览(52)
  • 微信小程序wx.setClipboardData复制文本

    今天在开发中遇到一个问题,在小程序中 复制文本,在做之前也查了资料,大部分都是固定文本复制,(小程序本身是不能手动复制的)和需求还是不一样的。 对于复制官方文档中提供了: wx.setClipboardData 设置系统剪贴板的内容。调用成功后,会弹出 toast 提示\\\"内容已复制

    2024年02月09日
    浏览(43)
  • 微信小程序封装wx.request请求

    对微信小程序的印象我还停留在2年前刚入行的时候,那是还不懂什么是Promise,只知道小程序发请求有时候要在success回调中嵌套好多层(后来我才知道这叫 回调地狱 )。最近刚好有个小程序的项目交给我发开发,加上如今的我自认为对Promise掌握的还可以,所以这次也尝试着封

    2024年02月16日
    浏览(45)
  • 微信小程序wx.getUserProfile的用法

    接触了以前开发的一个微信小程序,发现wx.getUserInfo这个官方接口不能获取用户的信息,我重新创建了一个新的项目,发现可以用wx.getUserProfile这个官方接口来获取用户信息,具体操作如下:1.首先在xxxx.jslim里面定义初始值,isAuthorization是为了解决每次登陆都需要获取用户信息

    2024年02月14日
    浏览(38)
  • 微信小程序 wx.request 请求封装

    1、添加一些统一的参数或者配置 2、加上默认的请求头和cookie(有就加,没有就为空) 3、将参数,即传入的url地址、请求头传入请求中 4、封装 post 和 get 请求,使代码使用更加方便,以维护

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包