美文网首页前端框架APP & program
uni-app 根据用户不同身份显示不同的tabBar

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

作者: 为什么划船不靠桨 | 来源:发表于2023-03-13 10:30 被阅读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'
    })
    

    相关文章

      网友评论

        本文标题:uni-app 根据用户不同身份显示不同的tabBar

        本文链接:https://www.haomeiwen.com/subject/afhcrdtx.html