小程序自定義菜單Navbar

前言:採用模板template格式進行自定義所需要的菜單,以及可以根據不同的需求在同一個小程序中顯示不一樣的菜單navbar

效果對比圖:

效果對比圖

1.定義Navbar格式(在根目錄下新增一個.wxml文件)

<template name="navbar">
    <view class="tabBar_box" style="background-color:{{tabBar.backgroundColor}}; {{tabBar.position == 'top' ? 'top:0' : 'bottom:0'}};position:fixed;bottom:0;">
        <block wx:for="{{tabBar.list}}" wx:for-item="item" wx:key="nav">
            <navigator class="tabBar_nav" url="{{item.pagePath}}" style="width:{{1/tabBar.list.length*100}}%; " open-type="redirect" bindtap="changeTabBar">
                <image class="tabBar_icon" src="{{item.selected ? item.selectedIconPath : item.iconPath}}"></image>
                <text style="color:{{item.selected ? tabBar.selectedColor : tabBar.color}}">{{item.text}}</text>
            </navigator>
        </block>
    </view>
</template>

2.對navbar可進行自定義樣式(因爲小程序全部頁面都會用到,所以可在app.wxss中定義navbar樣式)

.tabBar_box{
    display: flex;
    flex-direction: row;
    justify-content: space-around;
    position: fixed;
    bottom: 0;
    left: 0;
    z-index: 999;
    width: 100%;
    height: 120rpx;
    border-top: 1rpx solid #d7d7d7; 
}

.tabBar_nav{
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    font-size: 28rpx;
    height: 100%;
}

.tabBar_icon{
    width: 50rpx;
    height:50rpx;
}

3.對於navbar菜單所顯示的只以及相關圖標信息值的配置可在全局app.js中進行初始化定義

 tabBar: {
    selectedColor: "#0592E4",
    list: [
      {
        pagePath: "/pages/List/List",
        text: "分潤詳情",
        iconPath: "/pages/image/Detail01.png",
        selectedIconPath: "/pages/image/Detail02.png",
        selected: true
      },
      {
        pagePath: "/pages/Spread/Spread",
        text: "推廣管理",
        iconPath: "/pages/image/tuig01.png",
        selectedIconPath: "/pages/image/tuig02.png",
        selected: false
      },
      {
        pagePath: "/pages/Settlement/Settlement",
        text: "結算管理",
        iconPath: "/pages/image/Settl01.png",
        selectedIconPath: "/pages/image/Settl02.png",
        selected: false
      },
      {
        pagePath: "/pages/Account/Account",
        text: "賬戶信息",
        iconPath: "/pages/image/me21.png",
        selectedIconPath: "/pages/image/me22.png",
        selected: false
      }
    ],
    position: "bottom"
    }

對於navbar相關數據初始化的定義就基本 已經完成,接下來就是要引用模板

<import src="../../navbar.wxml" />
<template is="navbar" data="{{tabBar}}"/>

【對於模板的引用有一點注意事項,

在定義模板時,<template name="navbar"></template>,

引用時              <template is="navbar" data="{{tabBar}}"/>

具體相關文檔參考 官方文檔:https://developers.weixin.qq.com/miniprogram/dev/reference/wxml/template.html

在每一個navbar所指向的頁面中,都需要定義賦值,否則該頁面初始化時無法讀取到數據

Page({

  /**
   * 頁面的初始數據
   */
  data: {
    tabBar: app.globalData.tabBar,
   
  },
});

採用template模板定義菜單已基本完成;

但還有一些動態操作功能需要實現

其一:點擊菜單進行頁面跳轉時,該圖標切換爲selectIconpath中路徑的圖標,selected:false也未更改

解決辦法:需要在點擊文字圖標時增加一個bindtap事件

changeTabBar

 /**
    * navbar菜單導航切換事件
    */
  changeTabBar: function () {
    var that = this;
    var _curPageArr = getCurrentPages();
    var _curPage = _curPageArr[_curPageArr.length - 1];
    var _pagePath = _curPage.__route__;
    if (_pagePath.indexOf('/') != 0) {
      _pagePath = '/' + _pagePath;
    }
    var tabBar = app.globalData.tabBar;
    console.log(tabBar);
    for (var i = 0; i < tabBar.list.length; i++) {
      tabBar.list[i].selected = false;
      if (tabBar.list[i].pagePath == _pagePath) {
        tabBar.list[i].selected = true;//根據頁面地址設置當前頁面狀態  
      }
    }
    that.setData({
      tabBar: tabBar
    });
  }, 

【注意if之後一定要重新賦值setData,因爲頁面加載是會讀取page-data中的數據,

雖然在if條件中進行判斷當前頁面以及進行修改selected值,但是並未進行賦值,所以會出現selecticonPath無效的情況】

其二:使用模板template自定義菜單是因爲比較靈活,如果採用微信小程序自身定義,無法進行靈活,或者可應用與菜單隻有一種情況下。我才用自定義template定義菜單是因爲我會出現兩種不一樣的菜單導航

解決辦法:可提前判斷當前登錄人的身份並且進行選擇相應的菜單導航值,或者刪除之後重新定義賦值

 /**
* 根據登錄人身份進行顯示navbar
* 1  團隊經銷商;0-個人經銷商
*/
  navbar: function () {
    var that = this;
    var type = app.globalData.userInfo.ChannelType
    var tabBar = app.globalData.tabBar;
    if (type == 0) {
      console.log("個人");
      for (var i = 0; i < tabBar.list.length; i++) {
        if (tabBar.list[i].text == "結算管理") {
          tabBar.list.splice(i, 1);//根據頁面地址設置當前頁面狀態  
          console.log(tabBar.list[i].text == "結算管理");
          that.setData({
            tabBar: app.globalData.tabBar
          });
        }
      }
      that.setData({
        tabBar: app.globalData.tabBar
      });

    }

  },

【因爲登錄之後就需要顯示相應的菜單,所以需要在頁面加載時去執行該方法】

  /**
   * 生命週期函數--監聽頁面加載
   */
  onLoad: function (options) {
    var that=this;
    that.navbar();    
  },
 

自定義菜單功能基本已實現,

 

【如有不正確的地方或者不恰當的地方還請指出,謝謝!】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章