一套小程序及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
- <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>
-
- <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的文件中使用
首页
- <view class="content">
- <tab-bar :current='0' :tabBarList="tabBerLists">tab-bar>
- // admin的 current 为1,以此类推
- view>
-
- <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
- <view class="content">
- <button @click="login">登录button>
- view>
-
- <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
- <view>
- <button @click="signOut">退出button>
- view>
-
- <script>
- export default {
- data() {
- return {
-
- }
- }
- methods: {
- signOut() {
- this.$global.tabBarCurrent = 0
- uni.reLaunch({
- url: '/pages/index/index'
- })
- }
- }
- }
- script>
评论记录:
回复评论: