uni-app自定义底部tab并且根据字段显示和隐藏

首先将所有tab使用到的页面创建好并且在pages里面配置好,要在pages.json中的"tabBar里面配置"custom": true将自带的tab底部导航关闭

复制代码
"pages": [{
			"path": "pages/mine/mine",
			"style": {
				"navigationBarTitleText": "我的"
			}
		},
		{
			"path": "pages/home/home",
			"style": {
				"navigationBarTitleText": "首页"
			}
		},
		{
			"path": "pages/Operation/Operation",
			"style": {
				"navigationBarTitleText": "运维"
			}
		},
		{
			"path": "pages/index/index",
			"style": {
				"navigationBarTitleText": "服务"
			}
		},
		{
			"path" : "pages/shebe/shebe",
			"style" : 
			{
				"navigationBarTitleText" : "设备"
			}
		}
	],
"tabBar": {
		"custom": true,
		"color": "#7A7E83",
		"selectedColor": "#1296db",
		"borderStyle": "black",
		"backgroundColor": "#F8F8F8",
		"list": [{
				"pagePath": "pages/home/home",
				"text": "首页",
				"iconPath": "static/imgs/imgs55.png",
				"selectedIconPath": "static/imgs/imgs5.png"
			},
			{
				"pagePath": "pages/Operation/Operation",
				"text": "运维",
				"iconPath": "static/imgs/imgs66.png",
				"selectedIconPath": "static/imgs/imgs6.png"
			},
			{
				"pagePath": "pages/shebe/shebe",
				"text": "设备",
				"iconPath": "static/imgs/imgs66.png",
				"selectedIconPath": "static/imgs/imgs6.png"
			},
			{
				"pagePath": "pages/index/index",
				"text": "服务",
				"iconPath": "static/imgs/imgs11.png",
				"selectedIconPath": "static/imgs/imgs1.png"
			},
			{
				"pagePath": "pages/mine/mine",
				"text": "我的",
				"iconPath": "static/imgs/imgs44.png",
				"selectedIconPath": "static/imgs/imgs4.png"
			}
		]
	},

在uni-app官网找到官网插件搜索tab底部找到自己要用的插件如(custom-tab-bar 自定义底部导航栏 - DCloud 插件市场

在每一个用到tab页面的底部使用

复制代码
 <CustomTabBar modifyType="index"></CustomTabBar>
import CustomTabBar from "@/components/custom-tab-bar/index.vue";
export default {
    components: {
        CustomTabBar
    }
  },
}

中modifyType="index"中的index根据自己定义的路径来定,在那个页面用感觉那个页面来定

如我在mine页面用代码就是

复制代码
  <CustomTabBar modifyType="mine"></CustomTabBar>
import CustomTabBar from "@/components/custom-tab-bar/index.vue";

如何根据权限设置tab显示几个,要找到我们引入的tab页面,然后根据相关要求进行更改

复制代码
<template>
	<view v-if="responseRoles.includes('sitemanage')">
		<view class="tab-main">
			<view class="tabs" :class="{ spaceCenter: tabList.length === 1 }">
				<view class="tab-item" :class="{ active: currentIndex === index }" v-for="(item, index) in tabList"
					:key="index" @click.stop="handleTab(item, index)">
					<image class="img" :src="currentIndex === index ? item.selectedIconPath : item.iconPath"></image>
					<view class="text">{{ item.label }}</view>
				</view>
			</view>
		</view>
	</view>
	<view v-if="responseRoles.includes('electricCollection')">
		<view class="tab-main">
			<view class="tabs" :class="{ spaceCenter: tabList.length === 1 }">
				<view class="tab-item" :class="{ active: currentIndex === index }" v-for="(item, index) in tabsTab"
					:key="index" @click.stop="handleTab(item, index)">
					<image class="img" :src="currentIndex === index ? item.selectedIconPath : item.iconPath"></image>
					<view class="text">{{ item.label }}</view>
				</view>
			</view>
		</view>
	</view>
	<view v-if="responseRoles.includes('operation')">
		<view class="tab-main">
			<view class="tabs" :class="{ spaceCenter: tabList.length === 1 }">
				<view class="tab-item" :class="{ active: currentIndex === index }" v-for="(item, index) in tabList"
					:key="index" @click.stop="handleTab(item, index)">
					<image class="img" :src="currentIndex === index ? item.selectedIconPath : item.iconPath"></image>
					<view class="text">{{ item.label }}</view>
				</view>
			</view>
		</view>
	</view>

</template>

<script>
	import {
		appgetInfo
	} from '@/src/api/api.js';
	export default {
		props: {
			modifyType: {
				type: String,
				default: "",
			},
		},
		computed: {
			tabList() {
				return this.tabs.filter((item) => item.show);
			},
		},
		data() {
			return {
				currentIndex: 0,
				responseRoles: [],
				tabs: [{
						label: "首页",
						type: "home",
						url: "/pages/home/home",
						iconPath: "/static/imgs/imgs55.png",
						selectedIconPath: "/static/imgs/imgs5.png",
						show: true,
					},
					{
						label: "运维",
						type: "Operation",
						url: "/pages/Operation/Operation",
						iconPath: "/static/imgs/imgs66.png",
						selectedIconPath: "/static/imgs/imgs6.png",
						show: true,
					},
					{
						label: "服务",
						type: "index",
						url: "/pages/index/index",
						iconPath: "/static/imgs/imgs11.png",
						selectedIconPath: "/static/imgs/imgs1.png",
						show: true,
					},
					{
						label: "我的",
						type: "mine",
						url: "/pages/mine/mine",
						iconPath: "/static/imgs/imgs44.png",
						selectedIconPath: "/static/imgs/imgs4.png",
						show: true,
					}
				],
				tabsTab: [{
						label: "首页",
						type: "home",
						url: "/pages/home/home",
						iconPath: "/static/imgs/imgs55.png",
						selectedIconPath: "/static/imgs/imgs5.png",
						show: true,
					},
					{
						label: "设备",
						type: "shebe",
						url: "/pages/shebe/shebe",
						iconPath: "/static/imgs/imgs66.png",
						selectedIconPath: "/static/imgs/imgs6.png",
						show: true,
					},
					{
						label: "服务",
						type: "index",
						url: "/pages/index/index",
						iconPath: "/static/imgs/imgs11.png",
						selectedIconPath: "/static/imgs/imgs1.png",
						show: true,
					},
					{
						label: "我的",
						type: "mine",
						url: "/pages/mine/mine",
						iconPath: "/static/imgs/imgs44.png",
						selectedIconPath: "/static/imgs/imgs4.png",
						show: true,
					}
				]
			};
		},
		methods: {
			handleTab(item, index) {
				if (this.currentIndex === index) {
					return;
				}
				uni.switchTab({
					url: item.url,
				});
			},
			async fetchTabData() {
				try {
					const response = await appgetInfo();
					this.responseRoles = response.roles;

				} catch (error) {
					console.error("获取数据失败:", error);
				}
			},

		},
		mounted() {
			this.fetchTabData();
			if (this.modifyType.length) {
				this.currentIndex = this.tabList.findIndex(
					(item) => item.type === this.modifyType
				);
				if(this.currentIndex===-1){
					this.currentIndex=1
				};
				
			}
		},
	};
</script>

<style lang="scss" scoped>
	.tab-main {
		position: fixed;
		z-index: 9999;
		width: 100%;
		bottom: 0;
		left: 0;
		background: #ffffff;
		box-shadow: 0rpx -1rpx 0rpx 0rpx #ebedf0;

		.tabs {
			display: flex;
			justify-content: space-between;
			padding: 0 50rpx;
			height: 120rpx;

			.tab-item {
				padding: 16rpx 50rpx;
				display: flex;
				align-items: center;
				flex-direction: column;

				.img {
					width: 50rpx;
					height: 50rpx;
				}

				.text {
					margin-top: 12rpx;
					font-size: 24rpx;
					font-weight: 500;
					color: #5d5d5d;
					line-height: 24rpx;
				}
			}

			.tab-item.active {
				.text {
					color: #4199d1;

				}
			}
		}

		.spaceCenter {
			justify-content: center;
		}
	}
</style>
相关推荐
小bo波1 小时前
Java Swing 图形用户界面实验 —— 从算术练习到游戏开发的完整实践
java·课程设计·gui·游戏开发·扫雷·swing
咖啡八杯3 小时前
GoF设计模式——备忘录模式
java·后端·spring·设计模式
SamDeepThinking13 小时前
裁掉那个差程序员后,给你看团队里高手的代码:这个习惯,希望你有
java·后端·程序员
朕瞧着你甚好14 小时前
技术雷达 & Java 集成评估报告 — Apache Tika 3.3.1
java·ai编程
MacroZheng15 小时前
短短几天,暴涨2.8万Star!又一款编程神器开源!
java·人工智能·后端
SamDeepThinking15 小时前
函数式编程:用BiFunction消除多类型分支的代码重复
java·后端·面试
小徐_23331 天前
Wot UI 2.2.0 发布:Button 新增 subtle,VideoPreview 预览体验继续增强
前端·微信小程序·uni-app
Flittly1 天前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了1 天前
Java 生成二维码解决方案
java·后端
人活一口气2 天前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot