首先感谢王红元老师的vue课程,从中受益良多。特别是在目录结构的划分、组件封装思想上受到了很大启发,下面为大家带来一个tabBar的组件封装。
一、创建一个存放公共组件的文件夹,里面再新建一个tabbar的文件夹。里面创建两个.vue文件:TabBar.vue和TabBarItem.vue 如图:
1、TabBar.vue代码展示:
<template> <div class="tab-bar"> <slot></slot> </div> </template> <script> export default { name: "TabBar" } </script> <style scoped> .tab-bar{ width:100%; height: 49px; position: fixed; bottom: 0; left: 0; z-index: 500; display: flex; justify-content: space-around; background-color: white; border-top: 1px solid #f3f3f3 } </style>
2、TabBarItem.vue代码展示:
<template> <div class="tab-bar-item" :style="{color: defaultColor}" @click="itemBind"> <div v-if="!isActive"> <slot name="item-icon"></slot> </div> <div v-else> <slot name="item-icon-active"></slot> </div> <div :style="activeStyle"> <slot name="item-text"></slot> </div> </div> </template> <script> export default { name: "TabBarItem", computed:{ isActive(){ //激活当前路由对应的tab项样式 return this.$route.path.indexOf(this.path) != -1 }, activeStyle(){ return this.isActive?{color:this.activeColor}:{} } }, props:{ path:{ type:String, default:'/' }, activeColor: { type:String, default: '#f96702' }, defaultColor:{ type: String, default: '#666' } }, methods:{ itemBind(){ //点击tabBar项跳转对应的路由 if(!this.isActive){ this.$router.replace(this.path) } } } } </script> <style scoped> .tab-bar-item{ position: relative; display: flex; flex-direction: column; justify-content: center; align-items: center; font-size: 13px } .tab-bar-item img{ display: block; width: 25px; height: 25px; margin-bottom: 2px; } </style>
二、创建一个MainTabBar.vue文件,用于导入上述组件,以及配置tabBar相关参数。代码展示:
<template> <tab-bar v-if="isShowTabbar"> <tab-bar-item v-for="item in tabBarArr" :path="item.path" :activeColor="activeColor" :defaultColor="defaultColor" > <template v-slot:item-icon> <img :src="item.defaultIcon"> </template> <template v-slot:item-icon-active> <img :src="item.activeIcon"> </template> <template v-slot:item-text> <div>{{item.name}}</div> </template> </tab-bar-item> </tab-bar> </template> <script> import TabBar from 'components/common/tabbar/TabBar' import TabBarItem from 'components/common/tabbar/TabBarItem' export default { name: "MainTabBar", components:{ TabBar,TabBarItem }, data(){ return{ activeColor:'#008cd6', //选中色 defaultColor:'#8a8a8a', //默认色 tabBarArr:[ { path:'/storelist', name:'加油闪付', defaultIcon:require('assets/img/tabbar/flashPay.png'), activeIcon:require('assets/img/tabbar/flashPayChoosed.png') }, { path:'/equity', name:'车主权益', defaultIcon:require('assets/img/tabbar/equity.png'), activeIcon:require('assets/img/tabbar/equityChoosed.png') }, { path:'/gasstation', name:'油站导航', defaultIcon:require('assets/img/tabbar/navigation.png'), activeIcon:require('assets/img/tabbar/navigationChoosed.png') }, { path:'/profile', name:'个人中心', defaultIcon:require('assets/img/tabbar/customerCenter.png'), activeIcon:require('assets/img/tabbar/customerCenterChoosed.png') } ] } }, computed:{ // 控制非tab页隐藏tab导航 isShowTabbar(){ return this.tabBarArr.map(val=>{return val['path']}).includes(this.$route.path) } } } </script>
三、导入组件
在App.vue文件中导入MainTabBar.vue组件;
然后调用即可;
至此tabBar的底部导航组件封装完成;
达到的功能:可配置默认色、激活色、图标、路由。
热门文章
- 长沙宠物领养救助站电话 长沙宠物领养救助站电话号码
- 疫苗分类包括动物疫苗吗为什么呢(动物疫苗属于疫苗分类吗)
- VPN安卓 | 4月3日19.8M/S|免费SSR/Clash/Shadowrocket/V2ray免费节点订阅分享
- 宠颐生宠物医院贵吗 宠颐生医院怎么样
- 全国十大名牌兽药厂有哪些(全国十大名牌兽药厂有哪些品种)
- VPN安卓 | 4月24日18.1M/S|免费Shadowrocket/SSR/V2ray/Clash免费节点订阅分享
- 看完这篇文章你就可以告诉领导你精通Zookeeper了
- 猫打疫苗和不打疫苗的区别(猫疫苗必须打吗 知乎)
- VPN安卓 | 3月14日20.7M/S|免费Clash/V2ray/Shadowrocket/SSR免费节点订阅分享
- VPN安卓 | 3月2日20.4M/S|免费Clash/SSR/V2ray/Shadowrocket免费节点订阅分享