微信小程序自定义底部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

目录
相关文章
|
11月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
11月前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
2129 1
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
645 0
微信小程序:自定义关注公众号组件样式
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
3月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
167 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
9月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
6月前
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
1392 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
5月前
|
监控 数据可视化 数据处理
微信养号脚本,全自动插件,AUTOJS开发版
这是一套自动化微信养号工具,包含主脚本`wechat_auto.js`与配置文件`config.json`。主脚本实现自动浏览朋友圈、随机阅读订阅号文章及搜索指定公众号三大功能,支持自定义滚动次数、阅读时长等参数。代码通过随机化操作间隔模拟真实用户行为,具备完善的错误处理和日志记录功能。配套UI模块提供可视化操作界面,可实时监控任务状态与运行日志,便于调整参数设置。控制器部分扩展了批量数据处理能力,如学生信息的增删改查操作,适用于多场景应用。下载地址:https://www.pan38.com/share.php?code=n6cPZ 提取码:8888(仅供学习参考)。
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
2963 7

热门文章

最新文章