vue项目实现Tab页面触底上拉切换下个Tab

news/2025/11/17 14:58:42/文章来源:https://www.cnblogs.com/xyyt/p/19232677

vue项目实现Tab页面触底上拉切换下个Tab

lv_0_20251113151402 lv_0_20251113151518

如题,实现Tab页面触底上拉切换下一Tab的功能,关键流程:下滑触底——显示“上拉切换下一页”——继续上拉超过一定距离(如100px)——切换下一页,重置相关参数。

关键代码:

一. 处理滚动的业务逻辑封装为goodsListScroll.js,代码如下:

//触底上拉切换下一页相关代码
export default {props: {last_tab: false, //是否是最后一个tab
  },data() {return {startY: 0,maxScroll: 0, //最大可滚动距离showHint: false, //底部显示切换下一页提示条      touchStart: false, //触摸开始置为true,触发Tab切换后重置为false,终止handleTouchMove中的逻辑isScrolling: false, //显示“切换下一Tab”后触摸开始标记为true、切换Tab后重置为false
    };},beforeDestroy() {// 移除事件监听this.$refs.container.removeEventListener('touchstart', this.handleTouchStart);this.$refs.container.removeEventListener('touchmove', this.handleTouchMove);},methods: {//重新计算最大滚动值(因为内容可能变化),获取商品列表后调用
    calculateMaxScroll() {if (this.$refs.container) {const element = this.$refs.container;this.maxScroll = element.scrollHeight - element.clientHeight;//不可滚动页面直接显示        if (this.maxScroll === 0 && (this.active < this.subCateList.length - 1)) {this.showHint = true}}},//容器滚动监听事件
    handleScroll(event) {const element = event.target;this.scrollTop = element.scrollTop;// 计算滚动百分比this.scrollPercentage = this.maxScroll > 0 ?Math.min(100, Math.round((this.scrollTop / this.maxScroll) * 100)) :0;// 检查是否滚动到底部if (element.scrollHeight == element.clientHeight) return; //初始化的时候高度会相等const isAtBottom = element.scrollHeight - element.scrollTop <= element.clientHeight + 10;// 显示或隐藏提示if (this.active < this.subCateList.length - 1) this.showHint = isAtBottom;},/*** @param {Object} e* 触摸开始标记,必须在这里设置,切换tab后置为false,终止handleTouchMove*/handleTouchStart(e) {this.touchStart = true},/*** 下滑触底上拉切换tab* 1. touchStart:触摸开始标志,切换tab后为false,终止代码执行* 2. isScrolling:页面上拉触底后置为true,同时记录当前位置作为滑动开始位置* 3. startY:计算触底上拉的初始位置,与实际触摸开始无关*/handleTouchMove(e) {//1. 滑动过程中已经触发过Tab切换的就不再执行if (!this.touchStart) return;//2. 已触底且isScrolling为false时获取滑动的位置,并将isScrolling置为trueif (this.showHint && !this.isScrolling) {this.isScrolling = true//3. 设置计算滑动距离的初始位置this.startY = e.touches[0].clientY;}//滑动过程中实时获取当前位置,并计算滑动距离const currentY = e.touches[0].clientY;const deltaY = this.startY - currentY; // 正值表示向上滑动// 只有向上滑动才处理if (deltaY > 0) {// 当向上滑动距离超过100px时触发切换if (deltaY > 100) {this.switchToNextTab();}}},//切换至下一个Tab
    switchToNextTab() {// 移除事件监听this.$refs.container.removeEventListener('touchstart', this.handleTouchStart);this.$refs.container.removeEventListener('touchmove', this.handleTouchMove);if (this.active < this.subCateList.length - 1) {this.active = this.active + 1//重置其他参数this.touchStart = falsethis.showHint = false;this.isScrolling = false;this.startY = 0;this.maxScroll = 0}}}
};

以上为完整代码,关键点有这些:

1. calculateMaxScroll():计算容器最大滚动值,在获取到商品列表数据后调用,不可滚动页面直接显示“上拉切换下一页”提示条;

2. handleScroll():商品列表容器滚动监听事件,针对可滚动页面在滑动到页面底部时,显示“上拉切换下一页”提示条;

3. handleTouchStart():滑动开始事件,将滑动开始标志touchStart置为true;

4. handleTouchMove():滑动过程监听,触底上拉超过一定距离,触发切换下一Tab的逻辑switchToNextTab();

5. switchToNextTab():切换下一Tab逻辑,移除滚动监听,所有相关参数重置。

代码中已经加了详细的注释,可以结合注释来看。

二. 页面相关代码:

<template><div id="container" class="h100" ref="container" @scroll="handleScroll"><!--tab栏--><van-tabs id="tabs" class="p_fixed top left w100" v-model="active" :title-active-color="redColor" :background="primaryColor" :color="primaryColor" title-inactive-color="#a8a8a8" swipe-threshold="4" sticky><van-tab v-for="(item,index) in cateList" :title="item.title"></van-tab></van-tabs><!--商品列表栏--><div class="goods_list w100 flex space_between" v-show="goodsList"><!--商品列表展示代码--></div><!--触达切换tab--><div v-if="!last_tab" class="switch-hint p_fixed c_f flex center f12" :class="{ show: showHint,hide:!showHint&&startY==0 }">上拉切换下一页</div></div>
</template><script>import { Tabs, Tab } from 'vant';import goodsListScroll from "@/assets/js/mixin/goodsListScroll.js"export default {name: "CateGoods",mixins: [goodsListScroll],components: {Nodata,[Tab.name]: Tab,[Tabs.name]: Tabs},data() {return {active: 0,cateList: '', //子分类列表
        goodsList: '', //瀑布流商品列表   
      }},watch: {//监听tab选择索引,获取对应的商品列表
      active(newValue, oldValue) {if (newValue > -1) {this.goodsList = ''let sub_rack_id = this.subCateList[this.active].sub_rack_id//获取商品列表this.getGoodsList(sub_rack_id, this.rack_id)}}},methods: {/*** @param {Object} rack_id* 获取商品列表*/getGoodsList(rack_id, rack_parent_id) {//调用接口获取商品列表数据,这里代码省略//获取商品列表后监听页面滚动if (!this.last_tab) {// 确保DOM更新后计算最大滚动值this.$nextTick(() => {this.scrollTopFn()// 添加触摸事件监听this.$refs.container.addEventListener('touchstart', this.handleTouchStart, { passive: false });this.$refs.container.addEventListener('touchmove', this.handleTouchMove, { passive: false });//计算页面可以滚动距离this.calculateMaxScroll();});}} else {this.goodsList = []}});}
</script><style lang="scss" scoped>#container {overflow-y: scroll;}/*滚动触底上拉切换下一个Tab相关样式*/.switch-hint {bottom: 30px;left: 50%;transform: translateX(-50%);background: rgba(0, 0, 0, 0.7);padding: 12px 30px;border-radius: 25px;opacity: 0;transition: opacity 0.5s, transform 0.5s;pointer-events: none;z-index: 100;}.switch-hint.show {opacity: 1;transform: translateX(-50%) translateY(-10px);}.switch-hint.hide {transition: none;}
</style>

如上,页面+goodsListScroll即可实现Tab页面的触底上拉切换下一Tab的功能。

其中添加“上拉切换下一页”是为了优化用户体验,如果没有提示条,直接切换回显的有些突兀。

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

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

相关文章

2025口碑水乳品牌TOP5:抗初老/保湿/修护款任你挑,构象亮感水乳凭抗初老实力出圈

2025口碑水乳品牌TOP5:抗初老/保湿/修护款任你挑,构象亮感水乳凭抗初老实力出圈随着护肤理念的升级,消费者对水乳的需求已从基础保湿转向“功效精准化、成分安全化、体验舒适化”,抗初老、修护屏障等核心需求推动水…

拼多多关键字搜索接口逆向:从 WebSocket 实时推送解析到商品数据结构化重建

拼多多的搜索接口采用了与京东、淘宝截然不同的技术架构 —— 核心商品数据通过 WebSocket 实时推送,配合多层参数加密和动态签名验证,传统的 HTTP 接口模拟方案几乎完全失效。本文将突破这种 "HTTP+WebSocket&…

2025留学机构哪家好机构排名

2025留学机构哪家好机构排名一、2025年留学机构选择:从高频搜索词看家长与学生最关心什么?2025年10月24日,随着留学市场逐步回暖,许多家庭又开始为子女的升学之路忙碌起来。作为拥有15年经验的国际教育规划师,张华…

arm linux gcc 编译

在 ARM Linux 系统上使用 GCC 编译,通常需要以下步骤:一、安装 GCC 和开发工具 在 ARM Linux 上,GCC 通常是通过包管理器(如 apt、yum、dnf)安装的。以下是一些常见的安装方式: 1. 使用 apt(Debian/Ubuntu) su…

2025较好的留学机构有哪些大学

2025较好的留学机构有哪些大学一、2025年留学机构怎么选?这五个问题帮你理清思路2025年10月24日,随着海外院校申请季的来临,许多准备留学的学生和家长又开始面临选择机构的难题。在搜索引擎上,大家最常输入的关键词…

详解set_output_delay的用法

set_output_delay,这个约束描述的是fpga的输出管脚的数据,相对于参考时钟有效沿的延迟。这个描述其实很不具体,缺少细节。早先我就对这个约束一直很困惑,因为根据名字,是设置数据输出的延迟,比如fpga一个输出管脚…

Educational Codeforces Round 184 部分题解

DEFEducational Codeforces Round 184 D - Removal of a Sequence 之前做过 2024 昆明的题,就很套路了。 考虑时光倒流,已经做完 \(x\) 次操作后第 \(k\) 个数就是 \(k\) ,倒流一次操作,求出 \(k\) 变哪里去。 每次…

2025杭州最大留学中介公司是哪家

2025杭州最大留学中介公司是哪家一、2025杭州最大留学中介公司是哪家? 作为一名拥有15年经验的国际教育规划师,我经常被杭州的学生和家长问及如何选择留学中介。随着2025年留学市场的复苏,许多家庭都在搜索:杭州留…

每位工程师都会遇到的 10 个 Kubernetes 问题(及解决方法)【转】

Kubernetes 看起来简单 - 直到它崩溃。 无论您部署了多少次,Kubernetes 总是能找到方法来考验您的耐心。 Pod 被卡住。容器崩溃。服务消失。 本文梳理了 10 个最常见的 Kubernetes 问题,它们的原因,最重要的是 - 如…

2025出国留学机构怎么样

2025出国留学机构怎么样一、2025出国留学机构怎么样:五大高频问题解析作为一位拥有12年经验的国际教育规划师,我经常被学生和家长问及如何选择留学中介。在2025年10月24日的今天,留学市场愈发复杂,许多人在搜索引擎…

本年度靠谱的运动场馆装修设计公司推荐

摘要 运动场馆装修行业在2025年迎来快速发展,随着全民健身意识的提升和体育产业的扩张,专业装修需求日益增长。本榜单基于市场调研、用户口碑和行业数据,为您推荐前十名运动场馆装修服务提供商,旨在帮助用户选择可…

2025成都正规的出国留学中介

2025成都正规的出国留学中介一、成都留学中介怎么选?这五类问题帮你理清思路作为一名拥有十二年国际教育规划经验的从业者,我每天都会接触到大量成都学生和家长的咨询。在2025年10月24日的今天,留学市场的信息愈发复…

二十四、企业落地异地多活、异地容灾架构

二十四、企业落地异地多活、异地容灾架构 目录二十四、企业落地异地多活、异地容灾架构1、K8s企业级两地三中心、异地多活、智能DNS落地1.1 两地三中心架构解析1.2 什么是异地多活?1.3 异地多活架构1.4 异地多活、两地…

AI 十大论文精讲(四):0.01% 参数实现全量大模型微调效果?LoRA 的低秩适配之谜

摘要: 论文《LoRA: Low-Rank Adaptation of Large Language Models》提出了一种高效的大模型微调方法,通过冻结预训练权重并插入可训练的低秩矩阵($\Delta W = B \cdot A$),显著降低参数规模(仅为原模型的0.01%-…

2025 最新铣头厂家推荐!直角 / 双向 / 万向 / 万能 / 加工中心侧 / 加长 / CNC 侧 / BT50 侧 / 90 度铣头优质厂家品牌排行榜及选型指南

在金属切削加工领域,铣头作为核心配套工具,其性能直接决定加工精度、生产效率与产品合格率。当前高端领域对工件加工精度要求已达微米级,大型工件多面切削效率低下、企业成本受限等行业痛点突出,而市场品牌鱼龙混杂…

uni-app 无法实现全局 Toast?这个方法做到了!

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣大家好,我是不如摸鱼去,wot-ui的主要维护者,欢迎来到我的 uni-app 分享专栏。 在 uni-app 开发中,我们经常遇到需要在任何地方(如网络请求拦截器、>路由…

权重矩阵初始化

权重矩阵初始化 是神经网络训练中至关重要的一步,它直接影响模型的收敛速度和性能。不恰当的初始化可能导致梯度消失、梯度爆炸或训练停滞。 以下是常见的几种权重矩阵初始化方法: 零初始化 (Zero Initialization):…

2025较好的留学机构排名前十

2025较好的留学机构排名前十一、2025年留学中介选择:五大高频问题解析作为一名拥有15年经验的国际教育规划师,我经常接触到学生和家长的咨询,尤其是关于如何筛选可靠的留学中介。随着2025年留学季的临近,许多人在搜…

2025杭州最大留学中介公司在哪里

2025杭州最大留学中介公司在哪里一、杭州留学中介如何选?这些高频搜索问题你遇到过吗?作为一位在留学咨询行业耕耘超过十二年的国际教育规划师,我每天都会接触到大量来自杭州学生和家长的咨询。在2025年10月25日的今…

2025出国留学机构大全排名榜

2025出国留学机构大全排名榜一、2025出国留学机构大全排名榜作为拥有八年经验的国际教育规划师,我经常被学生和家长问到这样的问题:到底哪家留学中介更靠谱?选择机构时应该看重哪些方面?听说有些机构专门做研究生申…