uni-app 微信小程序根据角色动态的更改底部tabbar

本文档详细介绍了如何在uni-app中利用uview-ui和vuex实现根据用户角色动态显示不同tabbar的功能。通过创建tabbar.js存储不同角色的菜单配置,修改page.json以设置基础tabbar,配置vuex存储和更新用户角色,以及在vue组件中使用u-tabbar显示相应tabbar。登录时获取用户角色并调用setRole方法更新状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 需求背景

公司要求开发一个小程序,要求二种不同权限的人群都可以使用,使用时根据不同的权限,获取不同的tabbar,以及展示对应不同的内容。

登录页面分为 用户登录管理员登录
在这里插入图片描述
1.2 用户登录和管理员登录的 tabbar 根据账号角色进行对应展示
在这里插入图片描述

1.1 源码下载

【源码】uni-app 微信小程序根据角色动态的更改底部tabbar

2. 问题前提及思路

uniapp 本身的动态设置tabbar方法 uni.setTabBarItem(OBJECT),但是使用这个方法刷新切换时会短暂白屏以及uni.setTabBarItem只能满足动态设置tabbar一项的内容,无法实现多项的需求。所有综合考虑决定还是使用uview-ui的Tabbar底部导航栏组件。
在这里插入图片描述
最终选择了uni-app的uview-ui(UI框架)+ vuex来完成这个功能。其中,vuex主要是用来存储当前的tabbar内容的。

3. 开始撸

3.1 设置 tabbar.js 配置不同角色不同的菜单

utils文件夹下新建一个tabbar.js,来存储不同权限下的底部导航数据。我这里有两种不同的权限,第二种权限比第一种权限多了两项菜单。

// 普通用户tabbar
let tab1 = [
	{
		"pagePath": "/pages/loginLogRecord/index",
		"text": "登录记录",
		"iconPath": "/static/icon_bx.png",
		"selectedIconPath": "/static/icon_bx_hover.png"
	},
	{
		"pagePath": "/pages/accessRecord/index",
		"text": "存取记录",
		"iconPath": "/static/icon_adress.png",
		"selectedIconPath": "/static/icon_adress_hover.png"
	},
	{
		"pagePath": "/pages/person/index",
		"text": "我的",
		"iconPath": "/static/icon_user.png",
		"selectedIconPath": "/static/icon_user_hover.png"
	}
]
// 管理员用户tabbar
let tab2 = [
	{
		"pagePath": "/pages/loginLogRecord/index",
		"text": "登录记录",
		"iconPath": "/static/icon_bx.png",
		"selectedIconPath": "/static/icon_bx_hover.png"
	},
	{
		"pagePath": "/pages/accessRecord/index",
		"text": "存取记录",
		"iconPath": "/static/icon_adress.png",
		"selectedIconPath": "/static/icon_adress_hover.png"
	},
	{
		"pagePath": "/pages/authorizationList/index",
		"text": "授权名单",
		"iconPath": "/static/authorization.png",
		"selectedIconPath": "/static/authorization_hover.png"
	},
	{
		"pagePath": "/pages/inventory/index",
		"text": "盘点",
		"iconPath": "/static/inventory.png",
		"selectedIconPath": "/static/inventory_hover.png"
	},
	{
		"pagePath": "/pages/person/index",
		"text": "我的",
		"iconPath": "/static/icon_user.png",
		"selectedIconPath": "/static/icon_user_hover.png"
	}
]
export default [
	tab1,
	tab2
]

3.2 设置 page.json

在page.json文件里,把tabbar里的几个页面去重放进去。只是单纯的写个路径,什么都不要添加。testiconPathselectedIconPath 字段全部删掉这里不需要配置。

"tabBar": {
	"color": "#333333",
	"selectedColor": "#328CFA",
	"backgroundColor": "#FFFFFF",
	"list": [
		{
			"pagePath": "pages/loginLogRecord/index"
		},
		{
			"pagePath": "pages/accessRecord/index"
		},
		{
			"pagePath": "pages/authorizationList/index"
		},
		{
			"pagePath": "pages/inventory/index"
		},
		{
			"pagePath": "pages/person/index"
		}
	]
}

3.3 vue 配置

uniapp是可以直接使用vuex的,所以,直接在项目的根目录下新建一个store文件夹,存储相关数据。

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import tabBar from '@/utils/tabbar.js'
const store = new Vuex.Store({
	state: {
		wx_token: '',
		tabBarList: [],
		roleId: 0, //0 普通员工,1管理员
	},
	mutations: {
		// 设置wx_token
		setWxtoken(state, data) {
			state.wx_token = data;
			uni.setStorageSync('wx_token',data)
		},
		// 设置用户角色ID
		setRoleId(state, data) {
			state.roleId = data;
			uni.setStorageSync('roleId',data)
			state.tabBarList = tabBar[data];
			uni.setStorageSync('tabBarList',tabBar[data])
		},
	},
})
export default store

在入口文件 main.js 中使用

import Vue from 'vue'
import App from './App'
import uView from "uview-ui";
import store from './store/index'
Vue.use(uView);
Vue.config.productionTip = false
Vue.prototype.$store = store
App.mpType = 'app'
const app = new Vue({
    ...App,
	store
})
app.$mount()

3.4 tabBar组件代码

<template>
	<view>
		<u-tabbar :list="tabBarList" :active-color="activeColor" :inactive-color="inactiveColor"  :height="84"
			:border-top="borderTop">
		</u-tabbar>
	</view>
</template>
<script>
	import store from '@/store'
	export default {
		props:{
			tabBarList:{
				type:Array,
				default:uni.getStorageSync('tabBarList')
			}
		},
		data() {
			return {
				borderTop: true,
				inactiveColor: '#909399',
				activeColor: '#328CFA',
			}
		},
	}
</script>

3.5 setRole方法

登录时,获取返回的权限,然后再调用setRole方法

<script>
	import { mapMutations } from 'vuex';
	export default {
		data() {
			return {
				roleId:0,
			};
		},
		methods: {
			methods: {
				...mapMutations(['setRoleId']),
			},
			//登录
			login() {
				this.setRoleId(this.roleId)// 0或者1
				uni.switchTab({
					url: '../index/index' //然后跳转到登录后的首页
				})
			}
		}

	}
</script>
评论 140
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值