小程序学习笔记-2:NavigationBar和TabBar的使用

上一篇:小程序学习笔记-1:微信小程序项目结构


本篇内容
* NavigationBarTabBar的设置
* 多标签页面切换

为小程序添加导航栏和Tab栏,效果图如下:

效果图

  • NavigationBar

有三个地方可以对导航条进行设置

  1. 全局配置
    在app.json中设置window
//app.json
"window": {
    "navigationBarBackgroundColor": "#ededed",
    "navigationBarTextStyle": "black",
    "navigationBarTitleText": "豆瓣电影"
  },
  1. 为每个页面配置
    在页面的json文件中配置
//search.json
"navigationBarBackgroundColor": "#ededed",
"navigationBarTextStyle": "black",
"navigationBarTitleText": "搜索"
  1. 页面navigation-bar节点

页面导航条配置节点,用于指定导航栏的一些属性。
指路:小程序官方文档:navigation-bar

可以给每个页面配置不同的导航条,包括文字内容,背景和字体颜色,颜色切换时的动画效果等。比在json中配置的可选项更多一些。

首先添加模板文件,注意navigation-bar必须结合page-meta使用,并且必须是page-meta的第一个节点。而page-meta必须是页面第一个节点。

<!-- pages/board/board.wxml -->
<!-- page-meta必须是页面的第一个节点 -->
<page-meta>
  <!-- navigation-bar必须是page-meta的第一个节点 -->
  <navigation-bar
    title="{{nbTitle}}"
    loading="{{nbLoading}}"
    front-color="{{nbFrontColor}}"
    background-color="{{nbBackgroundColor}}"
    color-animation-duration="2000"
    color-animation-timing-func="easeIn"
  />
</page-meta>
<view>
  <text>board</text>
</view>

在js文件中设置数据绑定

//pages/board/board.js
Page({
  data: {
    nbFrontColor: '#000000',
    nbBackgroundColor: '#35495e',
  },
  onLoad() {
    this.setData({
      nbTitle: '豆瓣榜单',
      nbLoading: true,
      nbFrontColor: '#ffffff',
      nbBackgroundColor: '#35495e',
    })
  },
  onShow:function() {
    if (typeof this.getTabBar === 'function' &&
      this.getTabBar()) {
      this.getTabBar().setData({
        selected: 0
      })
    }
  }
})

  • TabBar

如果小程序是一个多 tab 应用(客户端窗口的底部或顶部有 tab 栏可以切换页面),可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面。

方法一

TabBar在app.json文件中进行配置。指路:微信小程序官方文档-全局配置-tabBar

//app.json
{
  "tabBar": {
    "color": "#c0c0c0",                 //文字颜色
    "selectedColor": "#fff",           //选中文字颜色
    "borderStyle": "black",           //tabBar边框颜色,只有black和white可选
    "backgroundColor": "#35495e",     //背景颜色
    "position": "bottom",              //top和botteom可选
    "list": [                                    //tab选项,数量支持2-5个
      {
        "text": "榜单",
        "pagePath": "pages/board/board",          //页面路径,必须在app.json的pages中先定义
        "iconPath": "images/board.png",            //图标路径
        "selectedIconPath": "images/board-actived.png"
      },
      {
        "text": "搜索",
        "pagePath": "pages/search/search",
        "iconPath": "images/search.png",
        "selectedIconPath": "images/search-actived.png"
      }
    ]
  }
}

方法二:自定义tabBar

如果需要对tabbar进行更多个性化的配置,可以采用自定义的方式。指路:微信小程序官方文档:custom-tabbar

  1. 首先在app.json
    中的tabBar加入"custom": true(其他项目也配置好),声明 usingComponents 项
{
  "tabBar": {
    "custom": true,                //开启自定义
    "color": "#c0c0c0",
    "selectedColor": "#fff",
    "backgroundColor": "#35495e",
    "list": [{
      "pagePath": "page/board/board",
      "text": "榜单"
    }, {
      "pagePath": "page/search/search",
      "text": "搜索"
    }]
  },
  "usingComponents": {}           //在此全局声明自定义组件,或在每个页面的json文件中声明
}
  1. 在根目录下新建文件夹custom-tab-bar
    项目目录

index.js

Component({        //Component 构造器可用于定义组件,调用 Component 构造器时可以指定组件的属性、数据、方法等
  data: {          //组件数据,此处对应tabBar中的配置数据
    selected: 0,   //选中tab的index,从0开始
    color: "#c0c0c0",            //字体颜色
    selectedColor: "#000",       //选中字体颜色
    list: [{                     //tab列表,没有数量限制,可以大于5个
      pagePath: "/pages/board/board",  //这里的路径和app.json中的tabBar里定义的不同,最前边必须要加斜杠‘/’,tabBar里不可以加‘/’
      iconPath: "/images/board.png",
      selectedIconPath: "/images/board-actived.png",
      text: "榜单"
    }, {
      pagePath: "/pages/search/search",
      iconPath: "/images/search.png",
      selectedIconPath: "/images/search-actived.png",
      text: "搜索"
    }]
  },
  attached() {
  },
  methods: {
    switchTab(e) {
      const data = e.currentTarget.dataset     //获取事件对象的数据
      const url = data.path                    //页面url
      wx.switchTab({url})                      //跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
      // this.setData({                        //微信小程序文档给的示例上有这几行,但我试了注释掉没有影响。
      //   selected: data.index                //但是每个页面的js文件中必须设置selected
      // })
    }
  }
})

index.wxml

此时需要开发者提供一个自定义组件来渲染 tabBar,所有 tabBar 的样式都由该自定义组件渲染。推荐用 fixed 在底部的 cover-view + cover-image 组件渲染样式,以保证 tabBar 层级相对较高。

cover-view:
覆盖在原生组件之上的文本视图。
可覆盖的原生组件包括 mapvideocanvascameralive-playerlive-pusher

<!--miniprogram/custom-tab-bar/index.wxml-->
<cover-view class="tab-bar">
  <cover-view class="tab-bar-border"></cover-view>
  <cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab">
    <cover-image src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></cover-image>
    <cover-view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</cover-view>
  </cover-view>
</cover-view>

index.json和index.wxss见官方示例 custom-tabbar

  1. 页面js文件
    board.js
//pages/board/board.js
Component({
  pageLifetimes: {
    show() {
      if (typeof this.getTabBar === 'function' &&
        this.getTabBar()) {
        this.getTabBar().setData({
          selected: 0
        })
      }
    }
  }
})

自定义tabBar的官方示例片段中用的Component({}),小程序文档中说到:

事实上,小程序的页面也可以视为自定义组件。因而,页面也可以使用 Component 构造器构造,拥有与普通组件一样的定义段与实例方法。但此时要求对应 json 文件中包含 usingComponents 定义段。

L0中是用的Page({})注册的页面,这里可以对应的这样写:

//pages/board/board.js
Page({
      onShow:function() {
        if (typeof this.getTabBar === 'function' &&
          this.getTabBar()) {
          this.getTabBar().setData({
            selected: 0
          })
        }
      }
  })

search.js里把selected设置成1就可以了,其他代码一样。
补充:到后边发现,当把内容上拉到最底部的时候,自定义的tabBar会遮挡内容。需要注意处理一下。如果原有的tab栏可以满足功能,就不用自定义了。

自定义tabBar

直接在app.json中配置的不会遮挡

总结:

本篇学习记录了微信小程序中NavigationBar和TabBar的使用方法。

参考:

微信小程序官方文档:navigation-bar
微信小程序官方文档:tabBar


下一篇:小程序学习笔记-3:各页面结构和布局

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