uniapp小程序自定义tabbar

文章描述:

uniapp微信小程序自定义tabbar效果

 

在App.vue中的onShow生命周期中隐藏原生tabBar

onShow: function() {
      // 隐藏原生tabbar
      uni.hideTabBar({
        animation: false
      })
      console.log('App Show')
},

 

“errMsg”:”hideTabBar:fail not TabBar page”

如果有些页面并没有tabbar展示,而此时调用该function会fail,如果没有fail函数,会直接抛出报错。

// 隐藏官方tabbar
// #ifdef MP-WEIXIN
	uni.hideTabBar({
		animation: false,
			success: () => {
		},
		fail: () => {
			// 捕获报错,防止没有tabbar页面调用后控制台报错
		}
	});
//#endif

 

tabbar组件

<template>
  <view class="tabbar">
    <view class="tab" v-for="(item,index) in tabbarList" :key="index" @click="navigatorTo(item.url)">
      <!-- 判断是否有点击,如果没有就不是激活样式,点击就是激活的样式 -->
      <image class="imgsize" v-if="item.type == 0" :src="current == index ? item.selectIcon : item.icon"
        mode="widthFix"></image>
      <view :class="current == index ?'active':'text'">{{item.name}}</view>
    </view>
 
  </view>
</template>
 
<script>
  export default {
    name: "tabbar",
    props: {
      current: {
        type: Number,
        default: 0, //默认第一个页面tabbar激活
      },
    },
 
    data() {
      return {
        tabbarList: [
			{
			  type: 0,
			  icon: '/static/tabbar/home.png',
			  selectIcon: '/static/tabbar/home-s.png',
			  name: '首页',
			  url: '/pages/home/home',
			}, 
			{
			  type: 0,
			  icon: '/static/tabbar/yx.png',
			  selectIcon: '/static/tabbar/yx.png',
			  name: '新闻',
			  url: '/pages/news/list',
			},
			{
			  type: 0,
			  icon: '/static/tabbar/dc.png',
			  selectIcon: '/static/tabbar/dc.png',
			  name: '产品',
			  url: '/pages/ground/list',
			},
			{
			  type: 0,
			  icon: '/static/tabbar/ph.png',
			  selectIcon: '/static/tabbar/ph.png',
			  name: '案例',
			  url: '/pages/ranking/list',
			},
			{
			  type: 0,
			  icon: '/static/tabbar/me.png',
			  selectIcon: '/static/tabbar/me.png',
			  name: '我的',
			  url: '/pages/my/my',
			}
		]
      }
    },
    methods: {
      navigatorTo(e) {
        uni.switchTab({
          url: e,
        })
      },
    },
  }
</script>
 
<style lang="scss" scoped>
  .tabbar {
    position: fixed;
    bottom: 0;
    padding-bottom: constant(safe-area-inset-bottom);
    /* 兼容 iOS<11.2 */
    padding-bottom: env(safe-area-inset-bottom);
    /* 兼容iOS>= 11.2 */
    background-color: #FFFFFF;
    width: 100%;
    z-index: 1;
    box-sizing: border-box;
    box-shadow: 0rpx 0rpx 12rpx 2rpx rgba(0, 0, 0, 0.1);
    border-radius: 30rpx 30rpx 0rpx 0rpx;
    padding-top: 12rpx;
    display: flex;
    justify-content: space-around;
    align-items: center;
 
    .tab {
      display: flex;
      flex-direction: column;
      align-items: center;
    }
 
    .imgsize {
      width: 56rpx;
      height: 56rpx;
    }
 
    .text {
      margin-top: 4rpx;
      padding-bottom: 12rpx;
      font-size: 20rpx;
      color: #333333;
      line-height: 20rpx;
    }
 
    .active {
      margin-top: 4rpx;
      padding-bottom: 12rpx;
      font-size: 20rpx;
      color: #2196F3;
      line-height: 20rpx;
    }
  }
</style>

 

页面

<template>
  <view>
    <!-- 根据身份展示不同的tabBar -->
    
    <tabbar :current="current" v-if="role===1"></tabbar>
	<userbar :current="current" v-if="role===2"></userbar>
    </view>
</template>
<script>
import tabbar from "@/components/common/Tabbar.vue";
import userbar from "@/components/common/TabbarUser.vue";
export default {
	components:{
		tabbar,
		userbar
	},
    data(){
       return {
         current:0,  // 根据需要传入对应的索引号
		 role:1, // 1,2
      }
    },
    onShow(){
      
      this.current = 0   // 根据需要传入对应的索引号
   }
}
</script>

 

发布时间:2024/01/23

发表评论