uniapp:uni.createSelectorQuery函数结合vue的watch函数使用实例

news2024/11/28 0:48:30

提醒
本文实例是使用uniapp进行开发演示的。

一、需求场景

在开发详情页面时,不同产品描述文案不同,有的文案比较长,需求上要求描述文案最多展示4行文案,少于4行文案,全部显示,此UI高度自动适配,例如,只有一行文案,那么UI高度也是展示一行的高度,超过的部分文案不显示同时右边显示查看详情、查看更多或者展开等按钮,让用户点击此按钮进行查看。

二、需求分析

  1. 详情页面是通用的,显示描述的UI的高度是可变化的,最多是4行文案的高度;
  2. 实时监听描述文案的属性变化;
  3. 实时更新UI高度以及对应的UI样式;
  4. 需要知道什么时候DOM更新完成的;

三、技术方案

  1. 设置css属性:max-height: xxx; overflow: hidden;控制描述文案UI的最大高度和超过的文案隐藏起来;
  2. 使用vue的watch函数监听描述文案的属性变化;
  3. 使用uni.createSelectorQuery()获取节点信息(描述文案UI的高度);
  4. 使用vue的nextTick()函数等待 DOM 更新完成。

四、技术知识点简介

4.1 vue的watch函数

用于声明在数据更改时调用的侦听回调。
watch 选项期望接受一个对象,其中键是需要侦听的响应式组件实例属性 (例如,通过 data 或 computed 声明的属性)——值是相应的回调函数。该回调函数接受被侦听源的新值和旧值。

除了一个根级属性,键名也可以是一个简单的由点分隔的路径,例如 a.b.c。注意,这种用法不支持复杂表达式——仅支持由点分隔的路径。如果你需要侦听复杂的数据源,可以使用命令式的 $watch() API。

值也可以是一个方法名称的字符串 (通过 methods 声明),或包含额外选项的对象。当使用对象语法时,回调函数应被声明在 handler 中。额外的选项包含:

  • immediate:在侦听器创建时立即触发回调。第一次调用时,旧值将为 undefined。
  • deep:如果源是对象或数组,则强制深度遍历源,以便在深度变更时触发回调。详见深层侦听器。
  • flush:调整回调的刷新时机。详见回调的触发时机及 watchEffect()。
  • onTrack / onTrigger:调试侦听器的依赖关系。详见侦听器调试。

注意:声明侦听器回调时避免使用箭头函数,因为它们将无法通过 this 访问组件实例。

点击查看侦听器详情

4.2 uni.createSelectorQuery()

uni.createSelectorQuery()主要是获取节点信息。
返回一个 SelectorQuery 对象实例。可以在这个实例上使用 select 等方法选择节点,并使用 boundingClientRect 等方法选择需要查询的信息。

注意:

  • 使用 uni.createSelectorQuery() 需要在生命周期 mounted 后进行调用。
  • 默认需要使用到 selectorQuery.in 方法。
  • 支付宝小程序不支持 in(component),使用无效果
4.2.1 SelectorQuery

查询节点信息的对象

selectorQuery.in(component)

将选择器的选取范围更改为自定义组件 component 内,返回一个 SelectorQuery 对象实例。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)。

js代码示例, 选项式API

const query = uni.createSelectorQuery().in(this);
query
  .select("#id")
  .boundingClientRect((data) => {
    console.log("得到布局位置信息" + JSON.stringify(data));
    console.log("节点离页面顶部的距离为" + data.top);
  })
  .exec();

注意: 支付宝小程序不支持 in(component),使用无效果

4.2.2 selectorQuery.select(selector)

在当前页面下选择第一个匹配选择器 selector 的节点,返回一个 NodesRef 对象实例,可以用于获取节点信息。

selector 说明:

selector 类似于 CSS 的选择器,但仅支持下列语法。

  • ID 选择器:#the-id
  • class 选择器(可以连续指定多个):.a-class.another-class
  • 子元素选择器:.the-parent > .the-child
  • 后代选择器:.the-ancestor .the-descendant
  • 跨自定义组件的后代选择器:.the-ancestor >>> .the-descendant (H5 暂不支持)
  • 多选择器的并集:#a-node, .some-other-nodes
4.3 vue的nextTick()函数

等待下一次 DOM 更新刷新的工具方法。

类型

function nextTick(callback?: () => void): Promise<void>

当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变,都仅执行一次更新。

nextTick() 可以在状态改变后立即使用,以等待 DOM 更新完成。你可以传递一个回调函数作为参数,或者 await 返回的 Promise。

五、实例效果图

  1. 描述文案少于4行的UI效果图
    在这里插入图片描述
  1. 描述文案超过4行,超过的文案隐藏UI效果图
    在这里插入图片描述
  1. 描述文案全部显示UI效果图
    在这里插入图片描述

实例效果图演示步骤如下:

  1. 首先进入描述文案少于4行的UI效果图
  2. 点击更新描述文案,将描述文案增多,即可看到 描述文案超过4行,超过的文案隐藏UI效果图
  3. 点击查看详情按钮,即可查看完整的描述文案,同时查看详情按钮变成收起按钮,点击收起按钮即可隐藏超出的描述文案,这样也实现了展示全部描述文案和隐藏描述文案自由切换的功能,提升用户体验。

六、实例代码

testUniCreateSelectorQuery.vue文件代码

<template>
    <view class="content-root">
        <view class="content-wrap">
            <text class="title">{{ obj.title }}</text>
            <view id="desc" class="desc" :style="{ maxHeight: `${descViewHeight}rpx` }">
                <text>{{ obj.desc }}</text>
            </view>
            <view class="view-btn-wrap">
                <view class="view-btn" @click="updatDesc">更新描述文案</view>
                <view class="view-btn" v-if="showDetailBtn" @click="showOrHiddenDesc">{{ showOrHiddenDescBtnText }}
                </view>
            </view>
        </view>
    </view>
</template>
<script>
export default {
    data() {
        return {
            descViewHeight: 150,
            showOrHiddenDescBtnText: "查看详情",
            obj: {
                title: "1024程序员",
                desc: "1024程序员节(1024 Programmer's Day)是广大程序员的共同节日"
            },
            showDetailBtn: false,

        }
    },
    watch: {
        obj: {
            handler(newVal, oldVal) {
                console.log(`watch handler 回调 oldVal: ${oldVal} , newVal: ${newVal}`)
                this.trackObjDesc()
            },
            // 在侦听器创建时立即触发回调。第一次调用时,旧值将为 undefined。
            immediate: true,
            // 该回调将会在被侦听的对象的属性改变时调动,无论其被嵌套多深
            deep: true
        }
    },

    methods: {
        showOrHiddenDesc() {
            if (this.descViewHeight <= 150) {
                this.descViewHeight = 600
                this.showOrHiddenDescBtnText = "收起"
                return
            }

            this.descViewHeight = 150
            this.showOrHiddenDescBtnText = "查看详情"

        },
        // 更新desc内容
        updatDesc() {
            this.obj.desc = "1024程序员节(1024 Programmer's Day)是广大程序员的共同节日。1024是2的十次方,二进制计数的基本计量单位之一。针对程序员经常周末加班与工作日熬夜的情况,部分互联网机构倡议每年的10月24日为1024程序员节,在这一天建议程序员拒绝加班。\n 程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1G=1024M,而1G与1级谐音,也有一级棒的意思。"
        },

        trackObjDesc() {
            let _this = this
            // nextTick() 可以在状态改变后立即使用,以等待 DOM 更新完成
            this.$nextTick(() => {
                // 使用 uni.createSelectorQuery() 需要在生命周期 mounted 后进行调用。
                // 默认需要使用到 selectorQuery.in 方法。
                const query = uni.createSelectorQuery().in(this);
                query.select("#desc").boundingClientRect(res => {
                    const height = res.height
                    _this.showDetailBtn = height > 75 ? true : false
                    console.log(`获取到 height = ${height} , _this.showDetailBtn = ${_this.showDetailBtn}`)
                }).exec();

            });
        }
    }
}
</script>
<style scoped>
.content-root {
    height: 100%;
    background-color: #ffffff;
    padding: 32rpx;
}

.content-wrap {
    background-color: #ffffff;
}

.title {
    color: #000;
    font-size: 28rpx;
    font-family: PingFangSC-Medium, PingFang SC;
    font-weight: bold;
}

.desc {
    /* max-height: 150rpx; */
    overflow: hidden;
    color: #000;
    font-size: 24rpx;
    padding: 16rpx;
    background-color: #f5f5f5;
    /*  text 组件包含了长文本,可以考虑增加 user-select 属性,方便用户复制。 */
    -webkit-user-select: text;
    /* Safari */
    -moz-user-select: text;
    /* Firefox */
    -ms-user-select: text;
    /* IE 10+ */
    user-select: text;
    /* Standard syntax */
}

.view-btn-wrap {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
}

.view-btn {
    width: 200rpx;
    height: 80rpx;
    margin-top: 40rpx;
    line-height: 80rpx;
    align-items: center;
    text-align: center;
    border-radius: 8rpx;
    color: #000;
    font-size: 28rpx;
    background-color: #eeeeee;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2222602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧城管综合管理系统源码,微服务架构,基于springboot、vue+element+uniapp技术开发,支持二次开发

智慧城管源码&#xff0c;智慧城管执法办案系统源码 智慧城管综合执法办案平台是智慧城市框架下&#xff0c;依托物联网、云计算、多网融合等现代化技术&#xff0c;运用数字基础资源、多维信息感知、协同工作处置、智能化辅助决策分析等手段&#xff0c;形成具备高度感知、互联…

pikachu靶场-Cross-Site Scripting(XSS)

sqli-labs靶场安装以及刷题记录-dockerpikachu靶场-Cross-Site Scripting pikachu靶场的安装刷题记录反射型xss(get)反射型xss(post)存储型xssDOM型xssDOM型xss-xxss盲打xss之过滤xss之htmlspecialcharsxss之href输出xss之js输出 pikachu靶场的安装 刷题记录 反射型xss(get) …

《什么是大模型、超大模型和 Foundation Model?》

前言 大模型旨在解决人类面临的各种问题,提高人类的生产力和生活质量。是一门涉及计算机科学、数学、哲学、心理学等多个领域的交叉学科,旨在研究如何使计算机能够像人类一样思考、学习、推理和创造。大模型的出现,让很多产业人士认为这项技术会改变信息产业格局,即基于数…

解码专业术语——应用系统开发项目中的专业词汇解读

文章目录 引言站点设置管理具体要求包括&#xff1a; Footer管理基于URL的权限控制利用数据连接池优化数据库操作什么是数据连接池&#xff1f;优化的优势 利用反射改造后端代码&#xff0c;AJAX反射的作用及其在后端代码中的应用AJAX 实现前后端无刷新交互 引言 创新实践项目二…

ThingsBoard规则链节点:Delete Attributes节点详解

引言 删除属性节点简介 用法 含义 应用场景 实际项目运用示例 智能家居安全系统 物流跟踪解决方案 工业自动化生产线 结论 引言 ThingsBoard是一个开源的物联网平台&#xff0c;它提供了设备管理、数据收集与处理以及实时监控等功能。其中&#xff0c;规则引擎是其核心…

Clickhouse 笔记(一) 单机版安装并将clickhouse-server定义成服务

ClickHouse 是一个高性能的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;场景。它由俄罗斯搜索引擎公司 Yandex 开发&#xff0c;并在 2016 年开源。ClickHouse 以其卓越的查询性能和灵活的扩展性而闻名&#…

模拟信号采集显示器+GPS同步信号发生器制作全过程(焊接、问题、代码、电路)

1、制作最小系统板 在制作最小系统板的时候&#xff0c;要用USB转TTL给板子供电&#xff0c;留了一个电源输入的四个接口&#xff0c;同时又用排针引出来VCC和GND用于后续其他外设的电源供应&#xff0c;电源配有电源指示灯和保护电容&#xff0c; 当时在焊接的时候把接口处的…

云计算实验1——基于VirtualBox的Ubuntu安装和配置

实验步骤 1、VirtualBox的安装 本实验使用VirtualBox-7.0.10 进行演示。对于安装包&#xff0c;大家可以前往 VirtualBox官网下载页面(https :/ / www. virtualbox.org/wiki/Downloads)下载其7.0版本安装包进行安装&#xff0c;或者直接使用QQ群的安装包VirtualBox-7.0.10-15…

基于开源Jetlinks物联网平台协议包-MQTT自定义主题数据的编解码

目录 前言 1.下载官方协议包 2.解压 3.自定义主题 4.重写解码方法 5.以下是我解析后接收到的数据 前言 最近这段时间&#xff0c;一直在用开源的Jetlinks物联网平台在学习&#xff0c;偶尔有一次机会接触到物联网设备对接&#xff0c;在协议对接的时候&#xff0c;遇到了…

Spring面试题——第五篇

1. Spring的优点 轻量级和非侵入性&#xff1a;不需要引入大量的依赖和配置。面向切面编程&#xff1a;Spring提供了强大的面向切面编程&#xff0c;允许用户定义横切关注点&#xff0c;并将其与核心业务逻辑分离&#xff0c;提高了灵活性。依赖注入&#xff08;DI&#xff09…

java对接钉钉发送消息(纯萌新文档解惑)

java对接钉钉&#xff08;纯萌新文档解惑&#xff09; 注意&#xff1a;不是其他直接给你个写好的钉钉工具类&#xff0c;但不知道它怎么来的。是以钉钉官方文档为准&#xff0c;流程是什么&#xff0c;你想要什么可以自己在文档找&#xff08;所有文档都有只是萌新看着懵&…

Kafka高可用性原理深度解析

在分布式系统中&#xff0c;高可用&#xff08;High Availability, HA&#xff09;是指系统在面对硬件故障、网络分区、软件崩溃等异常情况时&#xff0c;仍能继续提供服务的能力。对于消息队列系统而言&#xff0c;高可用性尤为重要&#xff0c;因为它通常作为数据流通的中枢&…

SSD | (十)PCIe介绍(上)

文章目录 📚从PCIe的速度说起📚PCIe拓扑结构🐇PCI——总线型拓扑结构🐇PCIe——树形拓扑结构📚PCIe分层结构📚PCIe TLP类型📚PCIe TLP结构🐇通用结构🐇具体TLP的Header📚从PCIe的速度说起 PCIe发展至今,速度一代比一代快。 连接速度所示1、2等是指PCIe链接…

Python 打包成 EXE 的方法详解

#1024程序员节&#xff5c;征文# 日常开发中&#xff0c;python由于其便捷性成为了很多人的首选语言&#xff0c;但是python的环境配置也是有点麻烦的&#xff0c;那么我们如何让其变得更加友好呢&#xff1f;没错&#xff0c;就是打包成exe可执行文件。 一、PyInstaller 简介…

修改windows11的hosts,配置127.0.0.1域名(最清晰)

这里记录的是学习短链接项目&#xff0c;通过配置127.0.0.1域名&#xff0c;达到可以通过域名代替127.0.0.1访问127.0.0.1下的某个端口的服务&#xff0c;达到短链接的前缀的效果&#xff0c;这里展示windows11的更改过程。 一、hosts文件路径 C:\Windows\System32\drivers\e…

【Java数据结构】---哈希表

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 在顺序结构以及平衡树中&…

littlefs源码分析1-设计思考

1.littlefs设计目的 littlefs 最初是作为一个实验而构建的&#xff0c;目的是在微控制器的环境中了解文件系统设计。目的是&#xff1a;构建一个在不使用无限制内存的情况下对电源丢失和闪存磨损具有弹性的文件系统。 这对嵌入式文件系统littlefs提出了三个主要要求&#xff1…

【Linux】 exit 和 _exit 的区别

在Linux系统中&#xff0c;exit(int status) 和 _exit(int status) 都是用来终止进程的函数&#xff0c;都能通过参数 int status传递一个整型的退出状态码给父进程&#xff0c;但它们之间有一些重要的区别。 1. 头文件不同 exit() 函数定义在 <unistd.h> 中 _exit() 函…

【Python爬虫实战】高效解析和操作XML/HTML的实用指南

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、lxml的安装 &#xff08;一&#xff09;使用 pip 安装 &#xff08;二&…

(一)ubuntu下通过c++编译cpu版本paddleocr-2.8.1

编译环境 操作系统&#xff1a;ubuntu 20.04/22.04 OCR版本&#xff1a;paddleocr 2.8.1 Opencv版本&#xff1a;opencv3.4.16/4.10.0 o参照官方文档&#xff1a; PaddleOCR/deploy/cpp_infer/readme_ch.md at release/2.6 PaddlePaddle/PaddleOCR GitHubhttps://github…