当前位置:   article > 正文

uni-app 微信小程序根据角色动态的更改底部tabbar_uniapp使用unview根据角色生成tabbar

uniapp使用unview根据角色生成tabbar

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
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

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"
		}
	]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在入口文件 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/76954
推荐阅读