uniapp 实现可滑动顶部选项卡(菜单)

news2025/6/17 20:36:47

利用和实现可滑动顶部选项卡,实现的切换效果类似下图这种(顶部tab下方swiper):(代码具体效果只是实现可滑动顶部选项卡的功能,具体样式可自定义修改)
在这里插入图片描述

一、分步骤展示

构建顶部tab选项按钮步骤

1、使用组件布局,横向滑动需要使scroll-x=“true”
2、设置选项按钮的初始数据barNameList及当前默认第一个tab所在位置tabIndex
3、点击选项按钮获取当前下标值@click=“ontabtap”,切换状态

<scroll-view id="tab" scroll-x="true">
		<view v-for="(item,index) in barNameList" :key="item.id" class="tabName" :data-current="index" @click="ontabtap">
			<text class="tabName_text" :class="tabIndex == index?'active_text':''">{{item.name}}</text>
		</view>
</scroll-view>

<script>
	export default{
		data(){
			return{
				tabIndex:0,
				barNameList:[{
				    name: '待审核',
				    id: '0'
				}, {
				    name: '审核中',
				    id: '1'
				}, {
				    name: '已审核',
				    id: '2'
				},{
				    name: '全部',
				    id: '3'
				}]
			}
		},
		methods:{
			// scroll-view 点击 tab 时 改变下标
			ontabtap(e){
				let index = e.target.dataset.current || e.currentTarget.dataset.current;
				this.switchTab(index);
			},
			switchTab(index){
				if(this.tabIndex == index){
					return
				}
				this.tabIndex = index;
			}
		}
	}
</script>

构建下方swiper内容数据步骤

1、使用和组件布局
2、设置初始数据barContentList(假数据,项目中应该从接口中获取,此处只是为了方便看效果)
3、滑动swiper获取当前下标值@change=“tabChange”,切换状态

<swiper id="tabContent" :current="tabIndex" @change="tabChange">
	<swiper-item v-for="(item,index) in barContentList" :key="item.id">
		<view>
			<text>{{item.title}}</text>
			<text>{{item.statusLabal}}</text>
			<text>{{item.content}}</text>
		</view>
	</swiper-item>
</swiper>

<script>
	export default{
		data(){
			return{
				barContentList:[{
						id:"01",
						title:"标题1",
						status:"0",
						statusLabal:"待审核",
						content:"的声音如同风格与噶人菲亚特古"
					},
					{
						id:"02",
						title:"标题2",
						status:"1",
						statusLabal:"审核中",
						content:"大唐贵妃打瑞文u哦i"
					},
					{
						id:"03",
						title:"标题3",
						status:"2",
						statusLabal:"已审核",
						content:"大唐贵妃打瑞文u哦i"
					},{
						id:"04",
						title:"标题4",
						status:"3",
						statusLabal:"全部",
						content:"大唐贵妃打瑞文u哦i"
					}]
			}
		},
		methods:{
			// swiper滑动时改变下标
			tabChange(e){
				let index = e.target.current || e.detail.current;  // 获取到当前移动到第几个
				this.switchTab(index);
			},
			switchTab(index){
				if(this.tabIndex == index){
					return
				}
				this.tabIndex = index;
			}
		}
	}
</script>

style样式

<style>
	#tab{
		width: 100%;
		display: flex;
	}
	.tabName{
		text-align: center;
		width: 25%;
		display: inline-block;
		height: 80rpx;
		line-height: 80rpx;
		white-space: nowrap;
	}
	.tabName_text{
		display: inline-block;
		width: 100%;
		height: 100%;
	}
	.active_text{
		background-color: #FDDD9B;
		color: #FFFFFF;
	}
	#tabContent{
		width: 100%;
	}
</style>

两部分建立起效果连接的主要方法是通过点击tab或滑动swiper更改了下标值,将tabIndex值进行更新,因为二者都需要tabIndex值,所以一个改变了另一个也会随之改变,这样就实现了点击顶部tab下面内容会切换,滑动swiper顶部tab会切换二者同步的效果。

二、整体展示

下面是请求接口形式的完整代码:

<template>
	<view>
		<scroll-view id="tab" scroll-x="true">
			<view v-for="(item,index) in barNameList" :key="item.id" class="tabName" :data-current="index" @click="ontabtap">
				<text class="tabName_text" :class="tabIndex == index?'active_text':''">{{item.name}}</text>
			</view>
		</scroll-view>
		<swiper id="tabContent" :current="tabIndex" @change="tabChange">
			<swiper-item v-for="(item,index) in barContentList" :key="item.id">
				<view v-for="(listItem,listIndex) in item.data">
					<text>{{listItem.title}}</text>
					<text>{{listItem.statusLabal}}</text>
					<text>{{listItem.content}}</text>
				</view>
			</swiper-item>
		</swiper>
	</view>
</template>

<script>
	export default{
		data(){
			return{
				tabIndex:0,
				barNameList:[{
				    name: '待审核',
				    id: '0'
				}, {
				    name: '审核中',
				    id: '1'
				}, {
				    name: '已审核',
				    id: '2'
				},{
				    name: '全部',
				    id: '3'
				}],
				barContentList:[]
			}
		},
		methods:{
			onLoad() {
			    setTimeout(()=>{
			      this.barNameList.forEach((tabBar) => {
			          this.barContentList.push({
			              data: [],
			              isLoading: false,
			              refreshText: "",
			              loadingText: '加载更多...'
			          });
			      }); 
				  this.getList(0); // 默认初始获取第一个选项对应的数据
			    },350)
			},
			// 获取列表数据
			getList(index){
				let activeTab = this.barContentList[index];
				let list = [];
				// ......
				// 这里请求接口--> 获取数据返回值data--> list.push(data);
				// ......
				activeTab.data = activeTab.data.concat(list);
			},
			// swiper滑动时改变下标
			tabChange(e){
				let index = e.target.current || e.detail.current;  // 获取到当前移动到第几个
				this.switchTab(index);
			},
			// scroll-view 点击 tab 时 改变下标
			ontabtap(e){
				let index = e.target.dataset.current || e.currentTarget.dataset.current;
				this.switchTab(index);
			},
			switchTab(index){
				if(this.tabIndex == index){
					return
				}
				// 先清空前面访问的swiper的缓存,要不再次切换到之前访问过的tab的时候内容会显示多次
				this.barContentList[this.tabIndex].data = [];
				// 后赋值
				this.getList(index);
				this.tabIndex = index;
			}
		}
	}
</script>

<style>
	#tab{
		width: 100%;
		display: flex;
	}
	.tabName{
		text-align: center;
		width: 25%;
		display: inline-block;
		height: 80rpx;
		line-height: 80rpx;
		white-space: nowrap;
	}
	.tabName_text{
		display: inline-block;
		width: 100%;
		height: 100%;
	}
	.active_text{
		background-color: #FDDD9B;
		color: #FFFFFF;
	}
	#tabContent{
		width: 100%;
	}
</style>


可参考官网hello uniapp项目:https://hellouniapp.dcloud.net.cn/pages/template/tabbar/tabbar

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

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

相关文章

00后卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…

[论文阅读笔记22]Identity-Quantity Harmonic Multi-Object Tracking

这是一篇优化匹配策略的文章, 通过密度估计的辅助, 估计一个边界框内有多少目标, 从而恢复遮挡的轨迹. 发表在IEEE TIP 2022. 论文地址: https://ieeexplore.ieee.org/abstract/document/9725267/ 0. Abstract 通常的MOT算法在匹配阶段时, 都是通过线性指派问题求解, 即会计算…

最近骗子有点多

就这几天&#xff0c;也就是这几天&#xff0c;我听到身边有两个人的家里人因为某某事情被骗。第一个是我旁边的同事&#xff0c;说是家里的老人被骗了好十几万&#xff0c;说是有一个高收益的旅行团&#xff0c;交钱了就免费旅游&#xff0c;旅游也是真去了&#xff0c;而且每…

一文弄懂访问者模式

关于设计模式&#xff0c;我们得结合生活中的案例来学习&#xff1b;最近我在网上也看了不少文章&#xff0c;今天想跟大家分享一下关于访问者模式的一些知识&#xff0c;先来看一个简单的案例吧。 相信大家都去过医院&#xff0c;看完病&#xff0c;医生都会给我们开一个处方…

数据结构:算法的时间复杂度和空间复杂度

Hello各位老铁们&#xff01;我们又见面了&#xff0c;大家最近有没有坚持学习和敲代码呢&#xff1f;在这里小编就要督促一下大家了&#xff0c;我们每一天都敲一两道题&#xff0c;这样子久而久之的坚持下去你就会发现你已经在不知不觉的过程中变成了一个大佬。敲代码使我们快…

unity蒙板测试例子——传送门

返回目录 Unity蒙板测试例子——传送门一、例子介绍 大家好&#xff0c;我是阿赵。 蒙板测试&#xff08;Stencil Test&#xff09;是渲染管线的合并输出环节里面的一种测试&#xff0c;和透明度测试或者深度测试一样&#xff0c;它实际上也是控制颜色值是否应该显示出来的一种…

natapp + nginx 实现内网穿透

环境是我本地的win10 第一步&#xff1a;下载nginx压缩包并解压(这个自行百度吧) 第二步&#xff1a; 修改nginx的配置文件&#xff1a; 在最下方添加&#xff1a; #testserver {listen 8081;#你要映射的端口server_name localhost; #使用本地IPlocation / {proxy_pass…

面试官:如何搭建Prometheus和Grafana对业务指标进行监控?

Prometheus和Grafana都是非常流行的开源监控工具&#xff0c;可以协同使用来实现对各种应用程序、系统、网络和服务器等的监视和分析。 下面对Prometheus和Grafana进行简要介绍&#xff1a; Prometheus Prometheus是一款开源、云原生的系统和服务监控工具&#xff0c;它采用p…

戴尔惠普联想笔记本性价比(戴尔和联想笔记本性价比)

联想。 联想做笔记本时间长&#xff0c;售后、质量都不错&#xff0c;追求稳定&#xff0c;性价比合理&#xff0c;长久使用考虑&#xff0c;不会有太大笔记本毛病。 联想1984就开始进入笔记本电脑行业&#xff0c;由中科院投资&#xff0c;后来收购了IBM之后&#xff0c;笔记…

第13届蓝桥杯省赛真题剖析-2022年4月17日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第122讲。 第13届蓝桥杯省赛举办了两次&#xff0c;这是2022年4月17日举行的第一次省赛&#xff0c;比赛仍然采取线上形…

Air32F103CBT6|CCT6|KEIL-uVsion5|本地编译|STClink|(6)、Air32F103编译下载

目录 一、环境搭建 准备工作 安装支持包 二、新建工程 添加外设库支持 测试代码 三、下载烧录 一、环境搭建 准备工作 安装MDK5&#xff0c;具体方法请百度&#xff0c;安装后需要激活才能编译大文件 下载安装AIR32F103的SDK&#xff1a;luatos-soc-air32f103: Air32f…

FL Studio2023中文版本水果编曲工具

编曲、剪辑、录音、混音&#xff0c;23余年的技术积淀和实力研发&#xff0c;FL Studio 已经从电音领域破圈&#xff0c;成功蜕变为全球瞩目的全能DAW&#xff0c;把电脑变成全功能音乐工作室&#xff0c;接下来我们会为您一一展示FL Studio 21也叫做水果音乐编曲软件&#xff…

Chat GPT太强,多种玩法曝光

1、模拟面试、考试&#xff0c;备考等&#xff0c;以面试为例&#xff0c;让它扮演一个角色 先让它扮演互联网行业的商业分析师 2、写各种发言稿、文章、报告&#xff0c;给它你的明确要求和目标&#xff0c;以发言稿为例&#xff0c;输入继续&#xff0c;可以持续优化 3、…

报名截至在即 | “泰迪杯”挑战赛最后一场赛前指导直播!

为推广我国高校数据挖掘实践教学&#xff0c;培养学生数据挖掘的应用和创新能力&#xff0c;增加校企交流合作和信息共享&#xff0c;提升我国高校的教学质量和企业的竞争能力&#xff0c;第十一届“泰迪杯”数据挖掘挑战赛&#xff08;以下简称挑战赛&#xff09;已于2023年3月…

白银实时行情操作中的一些错误及其解决办法(下)

小编根据大师&#xff0c;网络上的高手以及自己的经验整理出的一些交易中典型的错误&#xff0c;投资者可以参考参考&#xff0c;有则改之无则加勉~续上文…… 问题三&#xff1a;长线获利的交易不容易坚持同时陷入盘整或亏损的交易&#xff08;特别是大仓持有的品种&#xff…

银行数字化转型导师坚鹏:ChatGPT解密与银行应用案例

ChatGPT解密与银行应用案例 ——开启人类AI新纪元 打造数字化转型新利器 课程背景&#xff1a; 很多企业和员工存在以下问题&#xff1a; 不清楚ChatGPT对我们有什么影响&#xff1f; 不知道ChatGPT的发展现状及作用&#xff1f; 不知道ChatGPT的银行业应用案例&#xff1f;…

dy对接接口获取数据

1.需求方&#xff1a; 1.已知账户&#xff0c;获取该账户下每天的发视频数据&#xff0c;同时获取一个视频连续30天的点赞数,分享数&#xff0c;评论数。 2.需求方确定在标题中附带来源和作者相关信息&#xff0c;从标题中提取该部分信息&#xff0c;作为原创和作者绩效考核。…

项目人力资源管理

相关概念 组织结构图:用图形表示项目汇报关系。最常用的有层次结构图、矩阵图、文本格式的角色描述等3种。 任务分配矩阵(或称责任分配矩阵)(RAM):用来表示需要完成的工作由哪个团队成员负责的矩阵,或需要完成的工作与哪个团队成员有关的矩阵。 一、规划人力资源管理(编…

【Mybatis源码分析】类型处理器(TypeHandler)及其注册

TypeHandler和TypeHandlerRegistryTypeHandlerTypeHandler 源码分析TypeHandler注册&#xff0c;TypeHandlerRegistry源码分析TypeHandler拓展案例总结TypeHandler 大伙都知道Mybatis是对JDBC的封装&#xff0c;那Mybatis是如何处理JDBC类型和Java类型之间的转换的呢&#xff…

图文在线翻译-文本翻译

随着国际交流不断增加&#xff0c;越来越多的企业需要将产品介绍、宣传文案等相关信息翻译成多种语言&#xff0c;以扩大海外市场。但传统的翻译过程通常比较繁琐&#xff0c;耗费时间和人力成本也相对较高。为此&#xff0c;我们推出了一款批量图文翻译软件&#xff0c;帮助企…