uniapp 自定义底部tabbar(无闪烁)

思路:

1.创建自定义的tabbar组件

2.增加启动页面page/index/index

3.在启动页面加载所有tab页面,使用tabbar组件进行切换

主要代码:

mytabbar.vue

<template>
	<view class="uni-tabbar">
		<view class="uni-tabbar__item" v-for="(item,index) in tabList" :key="index" @tap="changeTab(item)">
			<view class="uni-tabbar__icon" :class="[tabs[item].fontIcon, item == activeTab? 'active':'']"></view>
			<view class="uni-tabbar__label" :class="{'active': item == activeTab}">
				{{tabs[item].text}}
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		props: {
			tabList: {
				type: Array,
				default: ['tabMyIndex']
			},
			activeTab: {
				type: String,
				default: ''
			}
		},
		emits:['update:activeTab'],
		data() {
			return {
				tabs: {
					tabAdminIndex: {
						"pagePath": "/pages/admin/index",
						"selectedIconPath": "/static/tabBar/home_col.png",
						"text": "首页",
						"fontIcon": "w-icon-home"
					},
					tabAdminCustom: {
						"pagePath": "/pages/admin/custom",
						"selectedIconPath": "/static/tabBar/home_col.png",
						"text": "客户",
						"fontIcon": "w-icon-qq"
					},
					tabAdminDepartment: {
						"pagePath": "/pages/admin/department",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "部门",
						"fontIcon": "w-icon-user"
					},
					tabAdminPersonnel: {
						"pagePath": "/pages/admin/personnel",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "员工",
						"fontIcon": "w-icon-user"
					},

					tabSaleCustom: {
						"pagePath": "/pages/sale/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},

					tabSaleAdminCustom: {
						"pagePath": "/pages/saleadmin/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},
					tabSaleAdminPerformance: {
						"pagePath": "/pages/saleadmin/performance",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "业绩",
						"fontIcon": "w-icon-user"
					},
					tabSaleadminPersonnel: {
						"pagePath": "/pages/saleadmin/personnel",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "员工",
						"fontIcon": "w-icon-user"
					},

					tabEvaluateCustom: {
						"pagePath": "/pages/evaluate/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},

					tabEvaluateadminCustom: {
						"pagePath": "/pages/evaluateadmin/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},
					tabEvaluateadminPerformance: {
						"pagePath": "/pages/evaluateadmin/performance",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "业绩",
						"fontIcon": "w-icon-user"
					},
					tabEvaluateadminPersonnel: {
						"pagePath": "/pages/evaluateadmin/personnel",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "员工",
						"fontIcon": "w-icon-user"
					},

					tabOperationCustom: {
						"pagePath": "/pages/operation/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},

					tabOperationadminCustom: {
						"pagePath": "/pages/operationadmin/custom",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "客户",
						"fontIcon": "w-icon-user"
					},
					tabOperationadminPerformance: {
						"pagePath": "/pages/operationadmin/performance",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "业绩",
						"fontIcon": "w-icon-user"
					},
					tabOperationadminPersonnel: {
						"pagePath": "/pages/operationadmin/personnel",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "员工",
						"fontIcon": "w-icon-user"
					},

					tabMyIndex: {
						"pagePath": "/pages/my/index",
						"selectedIconPath": "/static/tabBar/person_col.png",
						"text": "我的",
						"fontIcon": "w-icon-user"
					},
				},
			};
		},
		methods: {
			changeTab(item) {
				this.$emit('update:activeTab', item)
			},
		}
	}
</script>

<style lang="scss" scoped>
	[nvue] uni-scroll-view,
	[nvue] uni-swiper-item,
	[nvue] uni-view {
		flex-direction: unset;
	}

	[nvue-dir-column] uni-swiper-item,
	[nvue-dir-column] uni-view {
		flex-direction: unset;
	}

	.uni-tabbar {
		display: flex;
		position: fixed;
		justify-content: space-around;
		bottom: 0;
		z-index: 999;
		width: 100%;
		height: 101upx;
		padding: 10upx 0;
		box-sizing: border-box;
		-moz-box-sizing: border-box;
		border-top: solid 1upx #ccc;
		background-color: #fff;
		box-shadow: 0px 0px 17upx 1upx rgba(206, 206, 206, 0.32);

		.uni-tabbar__item {
			display: block;
			line-height: 40upx;
			font-size: 36upx;
			text-align: center;
		}

		.uni-tabbar__icon {
			font-size: 36upx;
			padding-bottom: 4upx;

			&.active {
				color: #1ca6ec;
			}
		}

		.uni-tabbar__label {
			font-size: 30upx;

			&.active {
				color: #1ca6ec;
			}
		}
	}
</style>

page/index/index/vue

<template>
	<view>
		<view class="main">
			<adminIndex v-if="activeTab == 'tabAdminIndex'"></adminIndex>
			<adminCustom v-if="activeTab == 'tabAdminCustom'"></adminCustom>
			<adminDepartment v-if="activeTab == 'tabAdminDepartment'"></adminDepartment>
			<adminPersonnel v-if="activeTab == 'tabAdminPersonnel'"></adminPersonnel>

			<saleCustom v-if="activeTab == 'tabSaleCustom'"></saleCustom>

			<saleadminCustom v-if="activeTab == 'tabSaleAdminCustom'"></saleadminCustom>
			<saleadminPerformance v-if="activeTab == 'tabSaleAdminPerformance'"></saleadminPerformance>
			<saleadminPersonnel v-if="activeTab == 'tabSaleadminPersonnel'"></saleadminPersonnel>

			<evaluateCustom v-if="activeTab == 'tabEvaluateCustom'"></evaluateCustom>

			<evaluateadminCustom v-if="activeTab == 'tabEvaluateadminCustom'"></evaluateadminCustom>
			<evaluateadminPerformance v-if="activeTab == 'tabEvaluateadminPerformance'"></evaluateadminPerformance>
			<evaluateadminPersonnel v-if="activeTab == 'tabEvaluateadminPersonnel'"></evaluateadminPersonnel>

			<operationCustom v-if="activeTab == 'tabOperationCustom'"></operationCustom>

			<operationadminCustom v-if="activeTab == 'tabOperationadminCustom'"></operationadminCustom>
			<operationadminPerformance v-if="activeTab == 'tabOperationadminPerformance'"></operationadminPerformance>
			<operationadminPersonnel v-if="activeTab == 'tabOperationadminPersonnel'"></operationadminPersonnel>

			<my v-if="activeTab == 'tabMyIndex'"></my>
		</view>
		<view class="footer">
			<myTabbar :tabList="tabbar" v-model:activeTab="activeTab"></myTabbar>
		</view>
	</view>
</template>

<script>
	import myTabbar from '@/components/mytabbar.vue'

	import adminIndex from '@/pages/admin/index.vue'
	import adminCustom from '@/pages/admin/custom.vue'
	import adminDepartment from '@/pages/admin/department.vue'
	import adminPersonnel from '@/pages/admin/personnel.vue'

	import saleCustom from '@/pages/sale/custom.vue'

	import saleadminCustom from '@/pages/saleadmin/custom.vue'
	import saleadminPerformance from '@/pages/saleadmin/performance.vue'
	import saleadminPersonnel from '@/pages/saleadmin/personnel.vue'

	import evaluateCustom from '@/pages/evaluate/custom.vue'

	import evaluateadminCustom from '@/pages/evaluateadmin/custom.vue'
	import evaluateadminPerformance from '@/pages/evaluateadmin/performance.vue'
	import evaluateadminPersonnel from '@/pages/evaluateadmin/personnel.vue'

	import operationCustom from '@/pages/operation/custom.vue'

	import operationadminCustom from '@/pages/operationadmin/custom.vue'
	import operationadminPerformance from '@/pages/operationadmin/performance.vue'
	import operationadminPersonnel from '@/pages/operationadmin/personnel.vue'

	import my from '@/pages/my/index.vue'

	export default {
		data() {
			return {
				tabbar: [],
				activeTab: '',
			}
		},
		methods: {},
		onLoad() {
			let _role = localStorage.getItem('token')
			
			console.log(_role)
			if (_role == null || _role == '') {
				uni.reLaunch({
					url: '/pages/login/index'
				})
			}

			if (_role == 'admin') {
				this.tabbar = [
					'tabAdminIndex', 'tabAdminCustom', 'tabAdminDepartment', 'tabAdminPersonnel', 'tabMyIndex'
				]
				this.activeTab = 'tabAdminIndex'
			}
			if (_role == 'sale') {
				this.tabbar = [
					'tabSaleCustom', 'tabMyIndex'
				]
				this.activeTab = 'tabSaleCustom'
			}
			if (_role == 'saleadmin') {
				this.tabbar = [
					'tabSaleAdminCustom', 'tabSaleAdminPerformance', 'tabSaleadminPersonnel', 'tabMyIndex'
				]
				this.activeTab = 'tabSaleAdminCustom'
			}
			if (_role == 'evaluate') {
				this.tabbar = [
					'tabEvaluateCustom', 'tabMyIndex'
				]
				this.activeTab = 'tabEvaluateCustom'
			}
			if (_role == 'evaluateadmin') {
				this.tabbar = [
					'tabEvaluateadminCustom', 'tabEvaluateadminPerformance', 'tabEvaluateadminPersonnel',
					'tabMyIndex'
				]
				this.activeTab = 'tabEvaluateadminCustom'
			}
			if (_role == 'operation') {
				this.tabbar = [
					'tabOperationCustom', 'tabMyIndex'
				]
				this.activeTab = 'tabOperationCustom'
			}
			if (_role == 'operationadmin') {
				this.tabbar = [
					'tabOperationadminCustom', 'tabOperationadminPerformance', 'tabOperationadminPersonnel',
					'tabMyIndex'
				]
				this.activeTab = 'tabOperationadminCustom'
			}
		},
		components: {
			myTabbar,
			adminIndex,
			adminCustom,
			adminDepartment,
			adminPersonnel,
			saleCustom,
			saleadminCustom,
			saleadminPerformance,
			saleadminPersonnel,
			evaluateCustom,
			evaluateadminCustom,
			evaluateadminPerformance,
			evaluateadminPersonnel,
			operationCustom,
			operationadminCustom,
			operationadminPerformance,
			operationadminPersonnel,
			my
		}
	}
</script>

<style lang="scss" scoped>
	.main {
		height: calc(100vh - 101upx);
		overflow-y: scroll;
	}
	.footer {
		height: 101upx;
	}
</style>

page/login/index.vue

<template>
	<view class="page">
		<view class="content">
			<view class="title">用户登录</view>
			<form class="login-form">
				<view class="form-item form-item-inline">
					<text class="w-icon-user"></text>
					<input v-model="loginData.account" placeholder="请输入密码" />
					<text v-if="loginData.account.length > 0" class="w-icon-circle-close"
						@click="loginData.account = ''"></text>
				</view>
				<view class="form-item form-item-inline">
					<text class="w-icon-lock"></text>
					<input v-model="loginData.password" placeholder="请输入密码" :password="!showpwd" />
					<text v-if="showpwd && loginData.password.length > 0" class="w-icon-eye-o" @click="showpwd = !showpwd"></text>
					<text v-if="!showpwd && loginData.password.length > 0" class="w-icon-eye" @click="showpwd = !showpwd"></text>

				</view>
				<button class="submit-btn" @click="doLogin">登 录</button>
				
				<button class="" @click="toHome('admin')">管理员</button>
				<button class="" @click="toHome('sale')">销售</button>
				<button class="" @click="toHome('saleadmin')">销售管理</button>
				<button class="" @click="toHome('evaluate')">测评</button>
				<button class="" @click="toHome('evaluateadmin')">测评管理</button>
				<button class="" @click="toHome('operation')">运营管理</button>
				<button class="" @click="toHome('operationadmin')">运营管理</button>
			</form>
		</view>
	</view>
</template>

<script>
import fun from '../../common/fun'
	export default {
		data() {
			return {
				loginData: {
					account: '',
					password: '',
				},
				showpwd: false,
			}
		},
		methods: {
			doLogin() {
				fun.toPage('/pages/index/index')
			},
			
			toHome(type) {
				localStorage.setItem('token', type)
				
				uni.reLaunch({
					url: '/pages/index/index'
				})
			},
		}
	}
</script>

<style lang="scss">
	.content {
		position: absolute;
		width: calc(100% - 60px);
		top: 100px;
		left: 50%;
		transform: translateX(-50%);

		.title {
			width: 100%;
			font-size: 20px;
			text-align: center;
			margin-bottom: 30px;
		}

		.login-form {
			width: 100%;

			.form-item-inline {
				display: inline-flex;
			}

			.form-item {
				border-bottom: solid 1px #ddd;
				padding: 8px 3px;
				height: 56px;
				width: 100%;
				box-sizing: border-box;
				-moz-box-sizing: border-box;
				-webkit-box-sizing: border-box;

				input {
					height: 40px;
					width: 100%;
					line-height: 40px;
					font-size: 16px;
					padding: 0 5px;
				}

				[class^="w-icon-"],
				[class*=" w-icon-"] {
					font-size: 18px;
					margin-top: 10px;
				}
			}

			.submit-btn {
				margin-top: 50px;
				background-color: deepskyblue;
				color: #fff;
			}
		}
	}
</style>

page.json

{
	"easycom": {
		"autoscan": true,
		"custom": {
			// uni-ui 规则如下配置
			"^uni-(.*)": "@uni_modules/uni-$1/uni-$1.vue"
		}
	},
	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
		{
			"path": "pages/login/index",
			"style": {
				"navigationStyle": "custom"
			}
		}

		, {
			"path": "pages/index/index"
		}

		, {
			"path": "pages/my/index"
		}

		, {
			"path": "pages/admin/index"
		}, {
			"path": "pages/admin/custom"
		}, {
			"path": "pages/admin/department"
		}, {
			"path": "pages/admin/personnel"
		}

		, {
			"path": "pages/sale/custom"
		}

		, {
			"path": "pages/saleadmin/custom"
		}, {
			"path": "pages/saleadmin/performance"
		}, {
			"path": "pages/saleadmin/personnel"
		}

		, {
			"path": "pages/evaluate/custom"
		}

		, {
			"path": "pages/evaluateadmin/custom"
		}, {
			"path": "pages/evaluateadmin/performance"
		}, {
			"path": "pages/evaluateadmin/personnel"
		}

		, {
			"path": "pages/operation/custom"
		}

		, {
			"path": "pages/operationadmin/custom"
		}, {
			"path": "pages/operationadmin/performance"
		}, {
			"path": "pages/operationadmin/personnel"
		}
	],
	"globalStyle": {
		"navigationBarTextStyle": "black",
		"navigationBarTitleText": "uni-app",
		"navigationBarBackgroundColor": "#F8F8F8",
		"backgroundColor": "#F8F8F8"
	},
	"uniIdRouter": {}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zsh0409

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值