微信小程序中自定义tabbar

微信小程序在app.json中进行全局配置其中关于tabbar的部分已然可以满足大部分的项目需求。然而对于一些需要一些别致的样式或者在不同页面表现得tabbar不一致的情况下却是不能满足需求的。

类似的文章,网上也存有不少。我本后来者,在此留下个人的做法仅供参考。(此处图标采用iconfont图标,有关字体图标在小程序的使用参照微信小程序中使用iconfont)

1, 创建tabbar模板

有关template的用法请自行查看官方文档。
tabbar.wxml


  <template name="tabbar">
        <view class="footerBar">
            <block wx:for{{tabbarList}} wx:key{{item}}>
                <view class="fb_inner" bindtap="fbTapFn" data-item='{{item}}'>
                    <text class="iconfont {{item.icon}} fb_icon {{item.active?'active':''}} "></text>
                    <text class="fb_txt {{item.active?'active':''}}">{{item.txt}}</text>
                </view>
            </block>
        </view>
  </template>

对应的布局样式如下:
tabbar.wxss

      .footerBar{
        position: fixed;
        right: 0;
        bottom: 0;
        left: 0;
        height: 50px;
        background: #000;
        display: flex;
        align-items: center;
        justify-content: space-between;
    }
    .footerBar .fb_inner{
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }
    .fb_inner .fb_icon{
        font-size: 16px;
        color: #cfcfcf;
    }
    .fb_inner .fb_txt{
        margin-top: 8px;
        font-size: 14px;
        color: #cfcfcf;
    }
    .fb_inner .active{
        color: green;
    }

2, tabbar上的点击事件

关于点击事件,有两种做法。
第一种,在引入界面如同写该页面的事件函数一般对应你tabbar模版上的方法名新建一个函数。
第二种,单独写一个tabbar相关的js,在引入tabbar模板的页面js中引入tabbar.js中的方法。

tabbar.js


  function fbTapFn (){
    console.log(e)
  }
  module.export{
    fbTapFn:fbTapFn  
  }

3,以pages/index页面为例如下:

3.1 index.wxml

  import '../template/tabbar'
  <!--
    // 点击事件第一种的话此处直接如此即可
    // <template is="tabbar" data="{{tabbarList}}"></template>
  -->
   <!--点击事件第二种-->
    <view bind:tap="bindTapChange"> // 使用容器盛放主要绑定事件触发内部事件
          <template is="tabbar" data="{{tabbarList}}"></template>
    </view>

3..2 index.js

  
  import {fbTapFn } from '../template/tabbar' // 第二种点击方案需引入
  Page({
    data:{
      tabbarList:[
        {icon:'字体图标',active:'是否激活',txt:'tabItem文本'},
        {icon:'字体图标',active:'是否激活',txt:'tabItem文本'},
        {icon:'字体图标',active:'是否激活',txt:'tabItem文本'}
      ]
      // 第一种点击方式
      // fbTapFn (e) { console.log(e) }
      // 第二种点击方式
      bindTapChange(e){
         fbTapFn (e)
      }
    }
  })

3.3 最后不要忘了将tabbar的样式引入

建议进行全局引入


至此,小程序中如何自定义tabbar基本告捷。此处只是提供一种思路。另自定义tabbar不能使用原生的tabbar的wx.switchTab进行跳转。故页面没有原声tabbar的平滑过渡。既然提到此处,我看过一种解决的思路,即原生tabbar与自定义tabbar同时存在,原生负责执行点击切换的动作,自定义负责展示效果。觉得是一种可行的方案,但本人未进行实现验证。

--------------------------------------------19/03/25更新----------------------------------------------------
此前提供的思路:原生tabbar与自定义tabbar同时存在,原生负责执行点击切换的动作,自定义负责展示效果本人操作了一波感觉还可以。

在后来的项目中正好遇到一个小程序两个角色不同tabbar页面加上共有的一个tababr页面共计5个tabbar页面。

1, app.json配置原生tabbar

app.json

{
        "tabBar": {
        "color": "#a3a5a8",
        "selectedColor": "#24c733",
        "backgroundColor": "#FFFFFF",
        "list": [
            {
                "pagePath": "pages/commonPage/companyProfile/index",
                "text": "公司介绍"
            },
            {
                "pagePath": "pages/customer/businesscard/index",
                "text": "个人名片"
            },
            {
                "pagePath": "pages/customer/myInfo/index",
                "text": "我的信息"
            },
            {
                "pagePath": "pages/manager/management/index",
                "text": "客户管理"
            },
            {
                "pagePath": "pages/manager/personalCenter/index",
                "text": "个人中心"
            }
        ]
    },
}

2, tabbar.js事件更改

tabbar.js


  function fbTapFn (e){
    // 获取点击tabbar携带url进行跳转 此处亦可加入对当前页面的判断如果为当前页面则不跳转
    wx.switchTab(url)
  }
  module.export{
    fbTapFn:fbTapFn  
  }

3,app.js在小程序启动后调用wx.hideTabBar()隐藏掉原生的tabbar

app.js

App({
    onShow: function() {
        wx.hideTabBar()
    }
})

4, 具有tabbar的页面按上文引入所需文件。至此自定义的tabbar页面切换也可以具有平缓的切换效果了。

5,注意

实现的依据来自于小程序提供的wx.switchTab()及wx.hideTabBar()这两个api.因此我们要明白的一点是可成为tabbar页面的数量限制为5,也就是说至多存在5个页面可通过wx.switchTab()进行跳转。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容