一套小程序及app可能会有多个用户角色,多者能看到的内容应该是不一样的。
实现原理
舍弃uniapp原生的tabbar,使用uView插件下的u-tabbar导航插件来实现。
介绍 | uView 2.0 – 全面兼容 nvue 的 uni-app 生态框架 – uni-app UI 框架uView UI,是 uni-app 生态最优秀的 UI 框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水https://uviewui.com/components/intro.html根据uView 2.0 安装及配置在uniappApp中配置完善,配置完善后进行动态Tabbar设置
效果图
一、设置pages.json
配置需要跳转的路径,不进行图标及名称配置
"tabBar": {
"list": [{
"pagePath": "pages/home/home"
},
{
"pagePath": "pages/admin/admin"
},
{
"pagePath": "pages/me/me"
}
]
}
二、新建一个common文件夹,并创建文件tabbar.vue
tabbar.vue
<template>
<view>
<u-tabbar :value="getCurrent()" @change="tabbatChange" :fixed="true" :placeholder="true" :safeAreaInsetBottom="true">
<u-tabbar-item v-for="(item, index) in tabBarList" :key="index" :text="item.text" :badge="item.badge">
<image class="u-page__item__slot-icon" slot="active-icon" :src="item.icon"></image>
<image class="u-page__item__slot-icon" slot="inactive-icon" :src="item.inactive"></image>
</u-tabbar-item>
</u-tabbar>
</view>
</template>
<script>
import global from "@/utils/global.js"
export default {
props: ['current', 'tabBarList'],
data() {
return {
}
},
methods: {
getCurrent(){
return global.tabBarCurrent ? global.tabBarCurrent : this.current;
},
tabbatChange(index) {
global.tabBarCurrent = index
uni.switchTab({
url: this.tabBarList[index].pagePath,
})
}
}
}
</script>
<style lang="scss" scoped>
image {
width: 20px;
height: 20px;
}
</style>
引入的global.js文件中的内容
export default {
timer : null,
tabBarCurrent: 0
}
三、在utils下创建tabbar.js文件并输入配置信息
// 个人用户
const ordinary = [{
icon: '/static/home.png',
inactive: '/static/homeTwo.png',
badge: 0,
text: '首页',
pagePath: "/pages/home/home",
index: '0'
},
{
icon: '/static/me.png',
inactive: '/static/meTwo.png',
badge: 0,
text: '我的',
pagePath: "/pages/me/me",
index: '2'
}
]
// 企业用户
const member = [{
icon: '/static/home.png',
inactive: '/static/homeTwo.png',
badge: 0,
text: '首页',
pagePath: "/pages/home/home",
index: '0'
},
{
icon: '/static/admin.png',
inactive: '/static/adminTwo.png',
badge: 0,
text: 'admin',
pagePath: "/pages/admin/admin",
index: '1'
},
{
icon: '/static/me.png',
inactive: '/static/meTwo.png',
badge: 0,
text: '我的',
pagePath: "/pages/me/me",
index: '2'
}
]
export default {
ordinary,
member
}
四、在需要展示tabbar的文件中使用
首页
<template>
<view class="content">
<tab-bar :current='0' :tabBarList="tabBerLists"></tab-bar>
// admin的 current 为1,以此类推
</view>
</template>
<script>
export default {
data() {
return {
tabBerLists: []
}
},
onLoad() {
// 影藏原生的tabbar,有自定义tabbar的页面都要写一遍
uni.hideTabBar()
},
onShow() {
this.tabBerLists = uni.getStorageSync('tabBarList') // 自定义的tabbar赋值
},
methods: {
}
}
</script>
五、配置vuex,创建store文件夹及index.js文件夹
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import tabBar from '@/utils/tabBar.js' // 引入刚刚创建的tabBar.js
const store = new Vuex.Store({
state: {
tabBarList: [],
},
mutations:{
// 底部tabbar
setRoleId(state,data){
if(data === 1) {
state.tabBarList = tabBar.member
}else {
state.tabBarList = tabBar.ordinary
}
uni.setStorageSync('tabBarList', state.tabBarList) // 根据登录时传过来的值,存储对应的tabbarlist
},
}
})
export default store
六、在登录页使用vuex
<template>
<view class="content">
<button @click="login">登录</button>
</view>
</template>
<script>
export default {
data() {
return {
}
},
onLoad() {
},
methods: {
login() {
this.$store.commit('setRoleId', 0)
uni.switchTab({
url: '/pages/home/home'
})
}
}
}
</script>
<style>
</style>
七、在退出登录时,重置global文件中的数据,设置tabBarCurrent 为 0
<template>
<view>
<button @click="signOut">退出</button>
</view>
</template>
<script>
export default {
data() {
return {
}
}
methods: {
signOut() {
this.$global.tabBarCurrent = 0
uni.reLaunch({
url: '/pages/index/index'
})
}
}
}
</script>
版权声明:本文为博主作者:_Legend_King原创文章,版权归属原作者,如果侵权,请联系我们删除!
原文链接:https://blog.csdn.net/qq_63026743/article/details/134924953