前端框架APP & program

uni-app 根据用户不同身份显示不同的tabBar

2023-03-13  本文已影响0人  为什么划船不靠桨

最近在一个uni-app项目中遇到一个需求,在登录页面成功登录以后需要判断身份,不同的身份的进入不同的tabBar页面,但是在uni-app项目中pages.json中的tabBarlist数组只有一个,且不能写成动态的,那如何实现这个需求呢?答案是需要我们自定义tabBar

1、我们确定在 pages.json文件中的pages数组中的第一个页面就是进入程序时展示的第一个页面,那这个页面肯定就是我们的登录页面了。
2、将pages.json中的tabBarlist设置为空数组,即不再使用默认系统自带的tabBar组件。
3、创建tabBar.vue组件,组件内的代码内容如下。
<template>
    <view class="tab-bar">
        <view v-for="(item,index) in list" :key="index" class="tab-bar-item" @click="switchTab(item, index)">
            <image class="tab_img" :src="currentIndex == index ? item.selectedIconPath : item.iconPath"></image>
            <view class="tab_text" :style="{color: currentIndex == index ? selectedColor : color}">{{item.text}}</view>
        </view>
    </view>
</template>

<script>
    export default {
        props: {
            selectedIndex: { // 当前选中的tab index
                default: 0
            },
        },
        data() {
            return {
                color: "#666666",
                selectedColor: "#00BAB2",
                list: [],
                currentIndex:0,
            }
        },
        created() {
            this.currentIndex = this.selectedIndex;
            
            var _this = this
            
            if (uni.getStorageSync('identify') == 'nurse') {
                //护士
                _this.list = [{
                        "pagePath": "/pages/nursehome/nursehome",
                        "iconPath": "/static/tab/home_n.png",
                        "selectedIconPath": "/static/tab/home_s.png",
                        "text": "首页"
                    },
                    {
                        "pagePath": "/pages/personalcenter/personalcenter",
                        "iconPath": "/static/tab/personal_n.png",
                        "selectedIconPath": "/static/tab/personal_s.png",
                        "text": "我的"
                    }
                ]
            } else {
                //医管
                _this.list = [{
                        "pagePath": "/pages/home/home",
                        "iconPath": "/static/tab/home_n.png",
                        "selectedIconPath": "/static/tab/home_s.png",
                        "text": "首页"
                    },
                    {
                        "pagePath": "/pages/nurse/nurselist",
                        "iconPath": "/static/tab/nurse_n.png",
                        "selectedIconPath": "/static/tab/nurse_s.png",
                        "text": "护士"
                    },
                    {
                        "pagePath": "/pages/personalcenter/personalcenter",
                        "iconPath": "/static/tab/personal_n.png",
                        "selectedIconPath": "/static/tab/personal_s.png",
                        "text": "我的"
                    }
                ]
            }
        },
        methods: {
            switchTab(item, index) {
                this.currentIndex = index;
                
                let url = item.pagePath;
                uni.redirectTo({url:url})
            }
        }
    }
</script>

<style lang="scss">
    .tab-bar {
        position: fixed;
        bottom: 0;
        left: 0;
        right: 0;
        height: 100rpx;
        background: white;
        display: flex;
        justify-content: center;
        align-items: center;
        padding-bottom: env(safe-area-inset-bottom); // 适配iphoneX的底部

        .tab-bar-item {
            flex: 1;
            text-align: center;
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
            .tab_img {
                width: 37rpx;
                height: 41rpx;
            }
            .tab_text {
                font-size: 20rpx;
                margin-top: 9rpx;
            }
        }
    }
</style>

这里需要注意:里面的图片路径要写成绝对路径,不然打包的时候如果是在该项目下的页面会出现层级问题,显示不出来图片

4、在main.js文件中将自定义的tabBar定义为全局组件。
import tabBar from "components/tabBar/tabBar.vue"
Vue.component('tabBar',tabBar)
5、在每一个原本将要设置为tabBar的子页面添加我们自定义的tabBar组件。
//首页
<tabBar selectedIndex = 0></tabBar>

//护士列表
<tabBar selectedIndex = 1></tabBar>
6、登录页面中成功登录以后的页面的切换逻辑。
if(this.data.identify == '护士'){
    uni.setStorageSync('identify','nurse')
}else{
    uni.setStorageSync('identify','manager')
}

uni.reLaunch({
    url:'../home/home'
})
上一篇下一篇

猜你喜欢

热点阅读