uniapp动态底部tab栏

实现思路:

创建一个js文件用来存放所有的tabbar,不同的数组表示不同的tabbar组合。

创建一个vue文件用来制作底部tabbar组件。

使用vuex存储用户的身份信息,根据身份信息切换tabbar组合。

具体步骤:

新建一个tabbar.js文件,将不同的tabbar组合用不同的数组表示出来。

javascript 复制代码
// 公共页面
export const publicBar = [{
        "pagePath": "/pages/home/index",
        "iconPath": require("@/static/logo.png"),
        "selectedIconPath": require("@/static/logo2.jpg"),
        "text": "首页"
    },
    {
        "pagePath": "/pages/car/index",
        "iconPath": require("@/static/logo.png"),
        "selectedIconPath": require("@/static/logo.png"),
        "text": "购物车"
    }
]
 
// 自己的页面
export const selfBar = [{
        "pagePath": "/pages/home/index",
        "iconPath": require("@/static/logo.png"),
        "selectedIconPath": require("@/static/logo.png"),
        "text": "首页"
    },
    {
        "pagePath": "/pages/mine/index",
        "iconPath": require("@/static/logo.png"),
        "selectedIconPath": require("@/static/logo.png"),
        "text": "我的"
    },
]

创建一个vue文件编写底部tabbar组件代码。

html 复制代码
<template>
    <view class="tabbar-list">
        <view class="tabbar-item" v-for="(item, index) in tabBarList" :key="index" @click="changeActive(item, index)">
            <image class="img" :src="activeIndex === index ? item.selectedIconPath : item.iconPath"></image>
            <view>{{ item.text }}</view>
        </view>
    </view>
</template>
 
<script>
    import {
        mapState,
        mapMutations
    } from 'vuex'
    export default {
        data() {
            return {}
        },
        computed: {
            ...mapState('tabBarModule', ['activeIndex', 'tabBarList']),
        },
        methods: {
            ...mapMutations('tabBarModule', ['setUserInfo', 'changeIndex']),
            // 修改点击的tabbar项
            changeActive(item, index) {
                this.changeIndex(index)
                uni.switchTab({
                    url: item.pagePath
                })
            },
        },
        mounted() {
            // 模拟登录后获取的用户信息,'public'为公共模块,非'public'为我的模块
            this.setUserInfo('public')
            // this.setUserInfo('mine') 用这个进行切换就能看到不同的底部tabbar
        }
    }
</script>
<style lang="scss" scoped>
    .tabbar-list {
        display: flex;
        position: fixed;
        bottom: 0;
        width: 100%;
        height: 100rpx;
        border: 1px solid #ccc;
        overflow: hidden;
 
        .tabbar-item {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
 
            .img {
                width: 50rpx;
                height: 50rpx;
            }
        }
    }
</style>

在根目录创建store文件夹,在store文件夹下创建module文件夹和创建index.js文件,在module文件夹下面创建tabBarModule.js文件。

在tabBarModule.js文件中编写vuex代码,然后在store文件夹下面的index.js文件中引入tabBarModule.js文件作为一个模块。

javascript 复制代码
// 引入两个tabbar组合
import {
    publicBar,
    selfBar
} from '@/utils/tabbar.js'
export default {
    // 开启命名空间
    namespaced: true,
    // 存放基础数据
    state: {
        // 用户信息
        userInfo: uni.getStorageSync('userInfo') || '',
        // 初始化一个空的tabbar组合
        tabBarList: [],
        // 当前选中的tabbar项,控制页面刷新导航高亮位置不变
        activeIndex: uni.getStorageSync('acIndex') || 0, 
    },
    mutations: {
        // 保存用户信息
        setUserInfo(state, token) {
            uni.setStorageSync('userInfo', token)
            state.userInfo = token;
            // 根据用户信息切换tabbar组合
            token !== 'public' ?
                state.tabBarList = selfBar :
                state.tabBarList = publicBar
 
        },
        // 记录当前选中的tabbar项
        changeIndex(state, index) {
            uni.setStorageSync('acIndex', index)
            state.activeIndex = index
        }
    },
}
在index.js文件中引入tabBarModule模块,并且在mian.js中引入store
import tabBarModule from '@/store/module/tabBarModule.js'
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
    modules: {
        tabBarModule
    }
})

在每个页面引入刚才的底部tabbar组件,并且使用uni.hideTabBar()隐藏默认导航栏

附上page.json文件供参考

javascript 复制代码
{
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/home/index",
            "style": {
                "navigationBarTitleText": "home"
            }
        },
        {
            "path": "pages/mine/index",
            "style": {
                "navigationBarTitleText": "mine"
            }
        },
        {
            "path": "pages/car/index",
            "style": {
                "navigationBarTitleText": "car"
            }
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "uni-app",
        "navigationBarBackgroundColor": "#F8F8F8",
        "backgroundColor": "#F8F8F8"
    },
    "uniIdRouter": {},
    "tabBar": {
        "list": [
            {
                "pagePath": "pages/home/index"
            },
            {
                "pagePath": "pages/mine/index"
            },
            {
                "pagePath": "pages/car/index"
            }
        ]
    }
}

原文链接:https://blog.csdn.net/weixin_47190975/article/details/129353819

亲测有效,另外,点击退出后重新登录跳转首页activeIndex不会自动切换(即tab栏激活项未切换),在登录成功跳转首页前添加this.changeIndex(0)即可

相关推荐
天下无贼!44 分钟前
2024年最新版Vue3学习笔记
前端·vue.js·笔记·学习·vue
Jiaberrr1 小时前
JS实现树形结构数据中特定节点及其子节点显示属性设置的技巧(可用于树形节点过滤筛选)
前端·javascript·tree·树形·过滤筛选
赵啸林1 小时前
npm发布插件超级简单版
前端·npm·node.js
我码玄黄1 小时前
THREE.js:网页上的3D世界构建者
开发语言·javascript·3d
罔闻_spider1 小时前
爬虫----webpack
前端·爬虫·webpack
吱吱鼠叔1 小时前
MATLAB数据文件读写:1.格式化读写文件
前端·数据库·matlab
爱喝水的小鼠2 小时前
Vue3(一) Vite创建Vue3工程,选项式API与组合式API;setup的使用;Vue中的响应式ref,reactive
前端·javascript·vue.js
小晗同学2 小时前
Vue 实现高级穿梭框 Transfer 封装
javascript·vue.js·elementui
盏灯2 小时前
前端开发,场景题:讲一下如何实现 ✍电子签名、🎨你画我猜?
前端
WeiShuai2 小时前
vue-cli3使用DllPlugin优化webpack打包性能
前端·javascript