微信小程序自定義tabBar

概括

  • 注意事項(xiàng)
  • 項(xiàng)目結(jié)構(gòu)
  • 代碼
  • 適配低版本

參考文檔:

小程序官方的tabBar文檔
小程序官方的Component文檔
小程序app.json的配置

注意事項(xiàng)

  1. 自定義tabBar 基礎(chǔ)庫 2.5.0 開始支持
  2. 自定義tabBar的組件一定要叫 custom-tab-bar 并且一定要與app.js同級(jí)
  3. 在 app.json 中的 tabBar 項(xiàng)指定 custom 字段散庶,同時(shí)其余 tabBar 相關(guān)配置也補(bǔ)充完整欠橘。
  4. 所有 tab 頁的 json 里需聲明usingComponents 項(xiàng),也可以在 app.json 全局開啟。
// app.json 記得刪掉注釋

  "usingComponents": {
    "nav": "/components/nav_bar/nav_bar" // 用與做低版本適配的 自定義tabBar組件
  },
  "tabBar": {
    "custom": true, // 打開tabBar的自定義功能
    "color": "#212121",
    ...

項(xiàng)目結(jié)構(gòu)

  • 代替原生tabBar的 custom-tab-bar 是不是一定要這樣放危队?
    是的肴沫,一定要放在與app.js同級(jí)的項(xiàng)目結(jié)構(gòu), 而且一定要叫 custom-tab-bar
    微信小程序自定義tabBar 項(xiàng)目結(jié)構(gòu)

先碼為敬

custom-tab-bar

  1. wxml
<!--components/custom-tab-bar/index.wxml-->
<view class='my-bar ak-flexB {{isIpx ? "hackIPX" : ""}}'>
  <view wx:for="{{list}}" wx:key="index" class='my-bar__item ak-flexC' data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab" data-jump_type='{{item.jumpType}}'>
    <view class='my-bar__item-text ak-flex-columnC {{selected == index ? "my-bar__item-active" : ""}}'>
      <image class='my-bar__btn-img animated' mode='widthFix' src='{{selected === index ? item.selectedIconPath : item.iconPath}}'></image>
      {{item.text}}
      <view hidden="{{item.tagNum <= 0}}" class='my-bar__item-tag ak-flexC'>
        {{item.tagNum}}
      </view>
    </view>
  </view>
</view>
  1. js
// components/custom-tab-bar/index.js
let app = getApp();
Component({
  /**
   * 組件的屬性列表
   */
  properties: {
    now: {
      type: String,
      value: 'index'
    },
    cartNum: {
      type: Number,
      value: 0,
    }
  },

  /**
   * 組件的初始數(shù)據(jù)
   */
  data: {
    isIpx: app.globalData.isIpx,  // 用于適配全面屏的底部高度(iPhone X* 的底部杠杠)
    selected: 0, // 當(dāng)前選中的項(xiàng)
    color: "#333", // 未選中的字體的顏色
    selectedColor: "#d01716", // 選中時(shí)的字體顏色
    list: [{
      pagePath: "/pages/index/index", // 跳轉(zhuǎn)路徑掉房, 【switchTab的跳轉(zhuǎn)一定要在app.json中配置】
      iconPath: "/images/icon_index.png",
      selectedIconPath: "/images/icon_index_act.png",
      jumpType: "switchTab", // 跳轉(zhuǎn)的類型
      tagNum: 0,
      text: "首頁"
    }, {
      pagePath: "/pages/classificationII/classificationII",
      iconPath: "/images/icon_classify.png",
      selectedIconPath: "/images/icon_classify_act.png",
      jumpType: "switchTab",
      tagNum: 0,
      text: "分類"
    }, {
      pagePath: "/pages/shoppingCart/shoppingCart",
      iconPath: "/images/icon_cart.png",
      selectedIconPath: "/images/icon_cart_act.png",
      jumpType: "navigateTo",
      tagNum: 0,
      text: "購(gòu)物車"
    }, {
      pagePath: "/pages/center2/center2",
      iconPath: "/images/icon_my.png",
      selectedIconPath: "/images/icon_my_act.png",
      jumpType: "switchTab",
      tagNum: 0,
      text: "我的"
    }]
  },
  /**
   * 組件的方法列表
   */
  methods: {
    switchTab(e) {
      const data = e.currentTarget.dataset
      const url = data.path
      const jumpType = data.jump_type;
      wx[jumpType]({
        url
      })
      this.setData({
        selected: data.index
      })
    },
  }
})
  1. wxss
/* components/custom-tab-bar/index.wxss */
/*      彈性盒居中            */
.animated {
  -webkit-animation-duration: .7s;
  animation-duration: .7s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
}

.animated.infinite {
  -webkit-animation-iteration-count: infinite;
  animation-iteration-count: infinite;
}
@keyframes bounceIn {
  from,  20%,  40%,  60%,  80%,
  to {
    -webkit-animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
    animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
  }
  0% {
    opacity: 0;
    -webkit-transform: scale3d(0.3, 0.3, 0.3);
    transform: scale3d(0.3, 0.3, 0.3);
  }
  20% {
    -webkit-transform: scale3d(1.1, 1.1, 1.1);
    transform: scale3d(1.1, 1.1, 1.1);
  }
  40% {
    -webkit-transform: scale3d(0.9, 0.9, 0.9);
    transform: scale3d(0.9, 0.9, 0.9);
  }
  60% {
    opacity: 1;
    -webkit-transform: scale3d(1.03, 1.03, 1.03);
    transform: scale3d(1.03, 1.03, 1.03);
  }
  80% {
    -webkit-transform: scale3d(0.97, 0.97, 0.97);
    transform: scale3d(0.97, 0.97, 0.97);
  }

  to {
    opacity: 1;
    -webkit-transform: scale3d(1, 1, 1);
    transform: scale3d(1, 1, 1);
  }
}

.bounceIn {
  -webkit-animation-duration: 0.75s;
  animation-duration: 0.75s;
  -webkit-animation-name: bounceIn;
  animation-name: bounceIn;
  animation-delay: 0.26s;
}

.ak-flexC {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-justify-content: space-around;
    justify-content: space-around;
    -moz-box-pack: space-around;
    -webkit--moz-box-pack: space-around;
    box-pack: space-around;
    align-items: center;
    -webkit-align-items: center;
    box-align: center;
    -moz-box-align: center;
    -webkit-box-align: center;
}

/*      彈性盒居兩邊            */
.ak-flexB {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-justify-content: space-between;
    justify-content: space-between;
    -moz-box-pack: space-between;
    -webkit--moz-box-pack: space-between;
    box-pack: space-between;
    align-items: center;
    -webkit-align-items: center;
    box-align: center;
    -moz-box-align: center;
    -webkit-box-align: center;
}

/*              彈性盒縱向排列(居中)              */
.ak-flex-columnC {
    display: -webkit-box;
    display: -moz-box;
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;
    -webkit-justify-content: space-around;
    justify-content: space-around;
    -moz-box-pack: space-around;
    -webkit--moz-box-pack: space-around;
    box-pack: space-around;
    align-items: center;
    -webkit-align-items: center;
    box-align: center;
    -moz-box-align: center;
    -webkit-box-align: center;
    -webkit-box-orient: vertical;
    -webkit-box-direction: normal;
    -moz-box-orient: vertical;
    -moz-box-direction: normal;
    flex-direction: column;
    -webkit-flex-direction: column;
}
view{
  box-sizing: border-box;
}
.my-bar{
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 9;
  width: 100%;
  background-color: rgba(254, 254, 254, .96);
  box-shadow: 0 0 16px rgba(155, 155, 155, .5);
}
.my-bar__item{
  flex: 1;
  height: 98rpx;
  padding-top: 10rpx;
}
.my-bar__item-text{
  height: 100%;
  text-align: center;
  width: 100%;
  color: #333;
  position: relative;
}
.my-bar__item-text2:last-child{
  height: 100%;
  text-align: center;
  width: 100%;
  color: #333;
}

.my-bar__item-text, .my-bar__item-text2{
  font-size: 22rpx;
}
.my-bar__item-tag{
  position: absolute;
  top: 0;
  right: 62rpx;
  width: 26rpx;
  height: 26rpx;
  background-color: #d01716;
  color: #fff;
  border-radius: 50%;
  font-size: 20rpx;
}
.iconfont{
  font-size: 46rpx;
}

.my-bar__item-active{
  color: #d01716 !important;
}


.hackIPX{
  box-sizing: content-box;
  padding-bottom: 68rpx;
}

.my-bar__btn-img{
  width: 50rpx;
  height: 50rpx;
}
.my-bar__btn-img-act{
  width: 60rpx;
  height: 60rpx;
}

.hackIPX{
  box-sizing: content-box;
  padding-bottom: 48rpx;
  padding-top: 20rpx;
}
  1. app.json

  "usingComponents": {
    "nav": "/components/nav_bar/nav_bar"
  },
  "tabBar": {
    "custom": true,
    "color": "#212121",
    "selectedColor": "#d01716",
    "backgroundColor": "#fefefe",
    "list": [
      {
        "pagePath": "pages/index/index",
        "iconPath": "/images/icon_index.png",
        "selectedIconPath": "/images/icon_index_act.png",
        "text": "首頁"
      },
      {
        "pagePath": "pages/classificationII/classificationII",
        "iconPath": "/images/icon_classify.png",
        "selectedIconPath": "/images/icon_classify_act.png",
        "text": "分類"
      },
      {
        "pagePath": "pages/center2/center2",
        "iconPath": "/images/icon_my.png",
        "selectedIconPath": "/images/icon_my_act.png",
        "text": "我的"
      }
    ]
  },
  1. 在用到tabBar的頁面.js
  /**
   * 生命周期函數(shù)--監(jiān)聽頁面顯示
   */
  onShow: function() {
    let _this = this;
    if (!app.globalData.accessToken){
      // Tips: 1茧跋、沒有有登錄狀態(tài): 只設(shè)置tabbar
      console.log('沒有有登錄狀態(tài): 只設(shè)置tabbar')
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
        this.getTabBar().setData({
          ['selected']: 0
        })
      }
    }else{
      // Tips: 2、有登錄狀態(tài): 拿購(gòu)物車 用戶消息 優(yōu)惠券數(shù)據(jù)
      console.log('有登錄狀態(tài): 拿購(gòu)物車 用戶消息 優(yōu)惠券數(shù)據(jù)')
      app.myRequest('cartNum', {}, 'get',
        function (res) {
          if (typeof _this.getTabBar === 'function' &&
            _this.getTabBar()) {
            _this.getTabBar().setData({
              ['selected']: 0,
              ['list[2].tagNum']: res.data
            })
          }
          _this.setData({
            cartNums: res.data
          })
        }, 'top');
      this.showCoupons();
    }
  },


// 其實(shí)核心代碼 其他的代碼跟我的業(yè)務(wù)邏輯掛鉤的
//if (typeof this.getTabBar === 'function' &&
//  this.getTabBar()) {
//  this.getTabBar().setData({
//    ['selected']: 0
//  })
//}

OK 以上的這些玩意兒就夠你玩轉(zhuǎn)小程序的自定義tabBar了
但是我們要考慮到有些用戶死活不升級(jí)的情況
(別問我為什么卓囚,在遍地都是iOS12.x 的時(shí)候瘾杭,我的用戶還有iOS8.x 的)
就是微信版本低, 小程序的基礎(chǔ)庫版本也低哪亿,不支持展示小程序的自定義tabBar粥烁;
此時(shí)如果我們不做兼容的話 用戶將看不到底部欄

適配低版本

  • 注意, 我們這里用的是自定義組件來代替小程序的自定義tabBar
    從項(xiàng)目結(jié)構(gòu)上來說是用/components/tab_bar 來代替 /custom-tab-bar
    由于用到了自定義組件 而支自定義組件是從1.6.3 的基礎(chǔ)版本開始支持的
    如果需要穩(wěn)定的話蝇棉, 推薦線上最低基礎(chǔ)庫需要支持到 2.1.0

關(guān)鍵點(diǎn)有3個(gè)

  1. 自己的tabBar組件
  2. 隱藏官方的tabBar
  3. 控制自己的tabBar組建的顯示和隱藏

1. 自己的tanBar組件

a. /components/tab_bar/tab_bar.js

// components/table_bar/table_bar.js
let app = getApp();
Component({
  /**
   * 組件的屬性列表
   */
  properties: {
    now: {
      type: String,
      value: 'index'
    },
    cartNum: {
      type: Number,
      value: 0,
    }
  },

  /**
   * 組件的初始數(shù)據(jù)
   */
  data: {
    isIpx: app.globalData.isIpx,
  },
  /**
   * 組件的方法列表
   */
  methods: {
    _tableJump: function(e) {
      let jumpType = e.currentTarget.dataset.jump;
      if (jumpType == this.properties.now) {
        return;
      } else {
        if (jumpType == 'index') {
          wx.switchTab({
            url: '/pages/index/index'
          })
        } else if (jumpType == 'my') {
          wx.switchTab({
            url: '/pages/center2/center2'
          })
        } else if (jumpType == 'classify') {
          wx.switchTab({
            url: '/pages/classificationII/classificationII'
          })
        } else if (jumpType == 'cart') {
          wx.navigateTo({
            url: '/pages/shoppingCart/shoppingCart'
          })
        } else {
          wx.reLaunch({
            url: '/pages/find/find'
          })
        }
      }
    },
  }
})

b. /components/tab_bar/tab_bar.wxml

<!--components/tab_bar/tab_bar.wxml-->

<view class='my-bar ak-flexB {{isIpx ? "hackIPX" : ""}}'>
  <view class='my-bar__item ak-flexC' bindtap='_tableJump' data-jump='index'>
    <view class='my-bar__item-text ak-flex-columnC {{now == "index" ? "my-bar__item-active" : ""}}'>
      <image src='/images/icon_index.png' class='my-bar__btn-img animated' mode='widthFix' hidden="{{now == 'index'}}"></image>
      <image src='/images/icon_index_act.png' class='my-bar__btn-img-act animated bounceIn' mode='widthFix' hidden="{{now != 'index'}}"></image>
      首頁
    </view>
  </view>

  <view class='my-bar__item ak-flexC' bindtap='_tableJump' data-jump='classify'>
    <view class='my-bar__item-text ak-flex-columnC {{now == "classify" ? "my-bar__item-active" : ""}}'>
      <image src='/images/icon_classify.png' class='my-bar__btn-img animated' mode='widthFix' hidden="{{now == 'classify'}}"></image>
      <image src='/images/icon_classify_act.png' class='my-bar__btn-img-act animated bounceIn' mode='widthFix' hidden="{{now != 'classify'}}"></image>
      分類
    </view>
  </view>

  <view class='my-bar__item ak-flexC' bindtap='_tableJump' data-jump='cart'>
    <view class='my-bar__item-text ak-flex-columnC {{now == "cart" ? "my-bar__item-active" : ""}}'>
      <image src='/images/icon_cart.png' style='width: 56rpx; margin-top: -4rpx;' class='my-bar__btn-img animated' mode='widthFix' hidden="{{now == 'cart'}}"></image>
      <image src='/images/icon_cart_act.png' class='my-bar__btn-img-act animated bounceIn' mode='widthFix' hidden="{{now != 'cart'}}"></image>
      購(gòu)物車
      <view hidden="{{cartNum <= 0}}" class='my-bar__item-tag ak-flexC'>{{cartNum}}</view>
    </view>
  </view>

  <view class='my-bar__item ak-flexC' bindtap='_tableJump' data-jump='my'>
    <view class='my-bar__item-text2 ak-flex-columnC {{now == "my" ? "my-bar__item-active" : ""}}'>
      <image src='/images/icon_my.png' class='my-bar__btn-img animated' mode='widthFix' hidden="{{now == 'my'}}"></image>
      <image src='/images/icon_my_act.png' class='my-bar__btn-img-act animated bounceIn' mode='widthFix' hidden="{{now != 'my'}}"></image>
      我的
    </view>
  </view>
</view>

c. 在使用的頁面:

pages/index/index.wxml
<!-- pages/index/index.wxml -->
<tab-bar wx:if="{{useMyTB}}" now="index" cart-num="{{cartNums}}"></tab-bar>

pages/index/index.js :
Page({
  data: {
    useMyTB: app.globalData.useMyTB,
  },

  /**
   * 生命周期函數(shù)--監(jiān)聽頁面顯示
   */
  onShow: function() {
    let _this = this;
    if (!app.globalData.accessToken){
      // Tips: 1讨阻、沒有有登錄狀態(tài): 只設(shè)置tabbar
      console.log('沒有有登錄狀態(tài): 只設(shè)置tabbar')
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
        this.getTabBar().setData({
          ['selected']: 0
        })
      }
    }else{
      // Tips: 2、有登錄狀態(tài): 拿購(gòu)物車 用戶消息 優(yōu)惠券數(shù)據(jù)
      console.log('有登錄狀態(tài): 拿購(gòu)物車 用戶消息 優(yōu)惠券數(shù)據(jù)')
      
      app.myRequest('cartNum', {}, 'get',
        function (res) {
          if (typeof _this.getTabBar === 'function' &&
            _this.getTabBar()) {
            _this.getTabBar().setData({
              ['selected']: 0,
              ['list[2].tagNum']: res.data
            })
          }
          _this.setData({
            cartNums: res.data
          })
        }, 'top');

      app.myRequest('centerInfo', {},
        'get',
        function (res) {
          _this.setData({
            msg_num: res.data.msg_num,
            infoData: res.data,
            hiddenBindPhoneBlock: res.data.member.phone == '' ? false : true
          })
        }, 'top');
      this.showCoupons();
    }
  },

2. 隱藏官方的tabBar

首先我們要判斷版本篡殷,如果低于2.5.0的話钝吮,
做兼容, 隱藏官方的tabBar用自定義的tabBar板辽;
app.js的onLaunch中檢查版本做適配

// 做適配
    wx.getSystemInfo({
      success: function (res) {
        // 判斷SDK版本
        let sdkv = res.SDKVersion;
        console.log('當(dāng)前版本: ' + sdkv)
        let basicsVersion = [2, 5, 0]
        sdkv = sdkv.split(".");
        for (let i in sdkv) {
          if (parseInt(basicsVersion[i]) > parseInt(sdkv[i])) {
            console.warn('當(dāng)前版本小于2.5.0')
            wx.hideTabBar();
            _this.globalData.useMyTB = true;
          }
        }
      },
    })

3. 控制自己的tabBar組建的顯示和隱藏

其實(shí)上面代碼有寫啦 搜索 useMyTB

以上這些就是我對(duì)小程序自定義tabBar的理解和應(yīng)用了奇瘦, 歡迎指點(diǎn)

參考文檔:

小程序官方的tabBar文檔
小程序官方的Component文檔
小程序app.json的配置

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市劲弦,隨后出現(xiàn)的幾起案子耳标,更是在濱河造成了極大的恐慌,老刑警劉巖邑跪,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻捻,死亡現(xiàn)場(chǎng)離奇詭異纲仍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贸毕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門郑叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人明棍,你說我怎么就攤上這事乡革。” “怎么了摊腋?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵沸版,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我兴蒸,道長(zhǎng)视粮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任橙凳,我火速辦了婚禮蕾殴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岛啸。我一直安慰自己钓觉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布坚踩。 她就那樣靜靜地躺著荡灾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞬铸。 梳的紋絲不亂的頭發(fā)上批幌,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音嗓节,去河邊找鬼荧缘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赦政,可吹牛的內(nèi)容都是我干的胜宇。 我是一名探鬼主播耀怜,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼恢着,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了财破?” 一聲冷哼從身側(cè)響起掰派,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎左痢,沒想到半個(gè)月后靡羡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系洛,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年略步,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了描扯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趟薄,死狀恐怖绽诚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杭煎,我是刑警寧澤恩够,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站羡铲,受9級(jí)特大地震影響蜂桶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜也切,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一扑媚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贾费,春花似錦钦购、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至导犹,卻和暖如春唱凯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谎痢。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工磕昼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人节猿。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓票从,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親滨嘱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峰鄙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 今天遇到一個(gè)需求在小程序tabbar上做掃一掃的功能,但是官方提供的tabbar只能作為跳轉(zhuǎn)頁面使用太雨,只能自定義t...
    丶dove丶閱讀 151,530評(píng)論 33 21
  • 微信小程序 自定義tabbar 項(xiàng)目地址吟榴,歡迎 star https://github.com/songzeng2...
    許Y1世承諾閱讀 3,045評(píng)論 2 0
  • 需求:小程序底部導(dǎo)航欄上的按鈕數(shù)量和內(nèi)容要根據(jù)后臺(tái)返回的數(shù)據(jù)進(jìn)行配置顯示。 方案:有了上面的需求囊扳,小程序原生的ta...
    張大普奔閱讀 3,179評(píng)論 3 0
  • 博客地址:http://blog.mambaxin.com 1.新建template文件夾用于保存tabBar模板...
    曼巴童鞋閱讀 12,409評(píng)論 3 3
  • 在網(wǎng)絡(luò)音樂平臺(tái)經(jīng)過多年洗牌后吩翻,已經(jīng)從混戰(zhàn)走到了少數(shù)巨頭的時(shí)代兜看,相對(duì)來說清理容易,但在網(wǎng)絡(luò)音樂上行之有效的法則狭瞎,卻并...
    張書樂閱讀 1,813評(píng)論 2 50