微信小程序自定义tabBar

近期做个微信小程序项目,因项目设计需要,所以要做成自定义的tabBar才能实现设计效果图,具体效果如下图:

微信小程序自定义tabBar

其中扫码买单,这个按钮效果,微信自带的tabBar是无法实现的,其后尝试了下custom-tab-bar 也是无法实现。

没办法了,既然微信的tabBar无法实现。那就自己弄个真-自定义tabBar来实现好了。

各位看官莫慌,下面就把解决方案放上来。首先先来讲下解决方案的思路,然后再把代码送上。

思路:

微信的tabBar无法实现,那么就放弃微信的tabBar,改用Component 来实现。把微信自带的tabBar隐藏起来,用Component 做成伪tabBar并应该到页面上。

1、把app.json下的 tabBar 给干掉。这样在首页就不会有tabBar显示了。

2、写Component 伪tabBar并应该到页面上。

具体操作(代码)如下:

app.json删除 tabBar

微信小程序自定义tabBar

写Component 伪tabBar

// Componet/tabBar/tabBar.js
Component({
    /**
     * 组件的属性列表
     */
    properties: {
        idx: {
            type: Number,
            value: 0
        },
    },
    /**
     * 组件的初始数据
     */
    data: {
        tabBar: [{
                "pagePath": "../../pages/index/index",
                "text": "首页",
                "switchQr": false,
                "iconPath": "/image/home.svg",
                "selectedIconPath": "/image/home_sel.svg",
            },
            {
                "pagePath": "",
                "text": "扫码买单",
                "switchQr": true,
                "iconPath": "/image/saoma.svg",
            },
            {
                "pagePath": "../../pages/user/user",
                "text": "我的",
                "switchQr": false,
                "iconPath": "/image/mine.svg",
                "selectedIconPath": "/image/mine_sel.svg",
            },
        ]
    },
    /**
     * 组件的方法列表
     */
    methods: {
        goToTab: function (e) {
            //如果点击当前页面则不进行跳转
            if (this.data.idx == e.currentTarget.dataset.index) {
                return false
            }
            wx.navigateTo({
                url: e.currentTarget.dataset.url
            })
        },
        // 扫码
        switchQr() {
            // console.log(‘扫码‘)
            
        },
        
    }
})
<!--Componet/tabBar/tabBar.wxml-->
<view class="tabBar">
    <view class="cont">
        <block wx:for="{{tabBar}}" wx:for-item="item" wx:key="tabBar">
            <view class="item {{item.switchQr?‘switchQr‘:‘‘}}" catchtap="{{!item.switchQr?‘goToTab‘:‘switchQr‘}}" data-url="{{item.pagePath}}" data-index="{{index}}">
                <image class="ico" src="{{idx === index ? item.selectedIconPath : item.iconPath}}"></image>
                <view class="txt {{idx === index ? ‘selectedColor‘ : ‘‘}}">{{item.text}}
                </view>
            </view>
        </block>
    </view>
</view>
/* Componet/tabBar/tabBar.wxss */

.tabBar {
    width: 100%;
    position: fixed;
    bottom: 0;
    font-size: 20rpx;
    color: #8A8A8A;
    background: #fff;
    /* border-top: 2rpx solid #eee; */
    box-shadow: 0rpx 1rpx 6rpx rgba(0,0,0,0.3);
}

.cont {
    margin-top: 10rpx;
    padding: 0;
    z-index: 0;
    height: calc(100rpx + env(safe-area-inset-bottom) / 2);
    padding-bottom: calc(env(safe-area-inset-bottom) / 2);
    display: flex;
}

.cont .item {
    font-size: 24rpx;
    position: relative;
    flex: 1;
    text-align: center;
    padding: 0;
    display: block;
    height: auto;
    line-height: 1;
    margin: 0;
    background-color: inherit;
    overflow: initial;
    justify-content: center;
    align-items: center;
}

.cont .item .ico {
    width: 46rpx;
    height: 46rpx;
    margin: auto
}

.cont .item .txt{
    margin-top: 8rpx;
    color: #333;
}

.cont .switchQr .ico {
    position: absolute;
    width: 106rpx !important;
    z-index: 2;
    height: 106rpx !important;
    border-radius: 50%;
    font-size: 50rpx;
    top: -50rpx;
    left: 0;
    right: 0;
    margin: auto;
    padding: 0;

}
.cont .switchQr .txt{
    margin-top: 56rpx;
}

.cont .item .selectedColor{
    color: #ff4e4e;
}

在index/user的页面上应用。

1、要在index.json/user.json文件引用Componet

1 "usingComponents": {
2     "tabBar":"/Componet/tabBar/tabBar"
3   },

2、在页面的引用Componet

<!-- index.wxml -->
<tabBar idx="0"></tabBar>

<!--user.wxml -->
<tabBar idx="2"></tabBar>