jjzjj

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

衣Ini 2023-04-05 原文

先看官方文档给出的说明

查 询 节 点 信 息 的 对 象 , 返 回 一 个 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里拆开。这里再挂上揉在一起的小程序代码片段吧,可以对比或者调试,这样可能更方便去理解这个东西

微信开发者工具 | 代码片段地址

有关微信小程序(四) 节点查询 | wx.createSelectorQuery的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  8. ruby-on-rails - Rails 3 在一个查询中包含多个表 - 2

    我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params

  9. ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询? - 2

    我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使

  10. ruby-on-rails - 在不重新查询数据库的情况下重新排序 Rails 中的事件记录? - 2

    例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果

随机推荐