微信小程序自定义底部tabBar按钮

简介: 微信小程序自定义底部tabBar按钮

1、wxml页面代码

<!-- --------------------------tab页--------------------------- -->
<!-- 通过tabind来控制页面的显示和隐藏 -->
<view wx:if="{{tabind == 0}}">
  page0
</view>
<view wx:if="{{tabind == 1}}">
  page1
</view>
<view wx:if="{{tabind == 2}}">
  page2
</view>
<!-- --------------------------tab页--------------------------- -->
<!-- --------------------------底部按钮--------------------------- -->
<view class="tabBar">
  <view class="tabBar-item" bindtap="changeTab" data-id="0">
    <view>
        <image wx:if="{{tabind != 0}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png'>
        </image>
        <image wx:if="{{tabind == 0}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png'>
        </image>
    </view>
    <view class="" bindtap="changeTab" data-id="0" style="color:{{tabind == 0 ? 'blue' : 'grey'}};">页面0</view>
  </view>
  <view class="tabBar-item" bindtap="changeTab" data-id="1">
    <view>
      <image wx:if="{{tabind != 1}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png'>
      </image>
      <image wx:if="{{tabind == 1}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png'>
      </image>
    </view>
    <view class="" bindtap="changeTab" data-id="1" style="color:{{tabind == 1 ? 'blue' : 'grey'}};">页面1</view>
  </view>
  <view class="tabBar-item" bindtap="changeTab" data-id="2">
    <view>
      <image wx:if="{{tabind != 2}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png'>
      </image>
      <image wx:if="{{tabind == 2}}" class="tabBar-icon" src='cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png'>
      </image>
    </view>
    <view class="" bindtap="changeTab" data-id="2" style="color:{{tabind == 2 ? 'blue' : 'grey'}};">页面2</view>
  </view>
</view>
<!-- --------------------------底部按钮--------------------------- -->

2、wxss样式代码

/* 按钮图片样式 */
.tabBar-icon{
  width:54rpx;
  height: 54rpx;
}
/* 按钮栏的整体样式 */
.tabBar{
  width:100%;
      /*
        fixed(固定定位):生成绝对定位的元素,相对于浏览器窗口进行定位。元素的位置通过 "left", "top",     "right" 以及 "bottom" 属性进行规定。可通过z-index进行层次分级。
      */
  position: fixed;
    /* 固定在底部 */
  bottom:0;
  padding:10rpx;
  margin-left:-4rpx;
  background:pink;
  font-size:24rpx;
  color:#8A8A8A;
  box-shadow: 3rpx 3rpx 3rpx 3rpx #aaa; 
  z-index: 9999;
    /*子元素弹性布局*/
  display: flex;
}
/* 每个按钮的样式 */
 .tabBar-item{
  float:left;
  width: 100%;
  text-align: center;
  overflow: hidden;
}

3、js代码

Page({
  /**
   * 页面的初始数据
   */
  data: {
    tabind:0 //当前选中页面下标
  },
//切换tab页
changeTab(e){
    //获取dataset-id的值
    let ind = e.currentTarget.dataset.id;
    this.setData({
      tabind:ind,
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
  }
})

4、不足

以上代码可以实现自定义tab页的基本需求,但是可以看到wxml页面上的代码过于冗余,重复代码多,不易于后期阅读维护,对此,我们可以做以下改动:

我们可以在js页面中进行对tab按钮的数据维护,然后在wxml页面中用循环将按钮组渲染出来。

5、wxml页面代码

<view wx:if="{{tabind == 0}}">
  page0
</view>
<view wx:if="{{tabind == 1}}">
  page1
</view>
<view wx:if="{{tabind == 2}}">
  page2
</view>
<!-- --------------------------底部按钮--------------------------- -->
<view class="tabBar">
  <block wx:for="{{tabinf}}" wx:key="index" >
    <view class="tabBar-item" bindtap="changeTab" data-id="{{item.id}}">
      <view>
          <image wx:if="{{tabind != item.id}}" class="tabBar-icon" src='{{item.img}}'>
          </image>
          <image wx:if="{{tabind == item.id}}" class="tabBar-icon" src='{{item.img1}}'>
          </image>
      </view>
      <view class="" bindtap="changeTab" data-id="{{item.id}}" style="color:{{tabind == item.id ? 'blue' : 'grey'}};">{{item.title}}</view>
    </view>
  </block>
</view>
<!-- --------------------------底部按钮--------------------------- -->

6、js代码

Page({
  /**
   * 页面的初始数据
   */
  data: {
    tabind:0,
    //按钮组信息
    tabinf:[
        {
            img:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png',
            img1:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png',
            id:0,
            title:'页面0'
        },
        {
            img:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png',
            img1:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png',
            id:1,
            title:'页面1'
        },
        {
            img:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记.png',
            img1:'cloud://it-cloud-hdrd7.6974-it-cloud-hdrd7-1300036058/记账本/标记1.png',
            id:2,
            title:'页面2'
        }
    ]
  },
//切换tab页
changeTab(e){
    let ind = e.currentTarget.dataset.id;
    this.setData({
      tabind:ind,
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
  }
})

7、总结

tab按钮主要是利用了fixed(固定定位)布局来固定按钮的样式,tab页面切换的js代码逻辑其实并不难。

8、后话

如果在项目中会经常需要自定义tab页的话,我们还可以考虑将其封装成一个组件,详情查看:

https://blog.csdn.net/Twinkle_sone/article/details/113994621?spm=1001.2014.3001.5502

目录
相关文章
|
2月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
629 1
|
2月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
78 0
微信小程序:自定义关注公众号组件样式
|
4月前
|
小程序 开发者
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
本文介绍了如何在Taro项目中实现自定义tabBar。首先,在`app.config.ts`中设置`custom: true`并配置`tabBar`。
169 0
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
|
3月前
|
小程序 前端开发 生物认证
微信小程序如何将一个按钮放到页面的最底下?
微信小程序如何将一个按钮放到页面的最底下?
402 5
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
680 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
742 1
|
2月前
|
小程序 前端开发 测试技术
微信小程序的开发完整流程是什么?
微信小程序的开发完整流程是什么?
146 7
ly~
|
3月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
86 6
|
2月前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
244 1
|
2月前
|
小程序 前端开发 数据安全/隐私保护
微信小程序全栈开发中的身份认证与授权机制
【10月更文挑战第3天】随着移动互联网的发展,微信小程序凭借便捷的用户体验和强大的社交传播能力,成为企业拓展业务的新渠道。本文探讨了小程序全栈开发中的身份认证与授权机制,包括手机号码验证、微信登录、第三方登录及角色权限控制等方法,并强调了安全性、用户体验和合规性的重要性,帮助开发者更好地理解和应用这一关键技术。
86 5
下一篇
DataWorks