【每周一个小技巧】支付宝小程序自定义tabbar效果

简介: 【每周一个小技巧】支付宝小程序自定义tabbar效果

支付宝小程序内的自定义tabbar功能需求提了有两年了,在近期官方同学同步该功能已实现,下午花了点时间实现了该功能,将实操经验分享出来给大家,避免踩坑。
给大家看下效果图:



tabBar 作为支付宝小程序基础能力,提供底部操作栏进行切换页面。自定义 tabBar 作为补充能力,可以让开发者更加灵活地设置 tabBar,以满足更多个性化的场景。
在自定义 tabBar 模式下:
开发者需要提供一个自定义组件来进行 tabBar 的渲染及交互。
与 tabBar 样式相关的接口将失效。如 my.hideTabBar 等。
每个页面的 tabBar 组件实例是不同的,可通过 getTabBar 接口获取 tabBar 组件实例。

版本要求:
基础库 2.7.20 或更高版本。
支付宝客户端 10.2.63 或更高版本。
小程序开发者工具 3.1.2 或更高版本。

IDE下载地址:
https://opendocs.alipay.com/mini/ide/download

下载安装3.1.2beta版本IDE后,左上角设置里默认基础库是 2.7.21



接下来是实操阶段:
第一步:app.json中指定当前tabbar为自定义tabbar

{
  "pages": [
    "pages/index/index",
    "pages/alipayMent/index",
    "pages/poster/index",
    "pages/canvas/index",
    "pages/imgCopper/index",
  ],
  "tabBar": {
    "textColor": "#6C6C6C",
    "selectedColor": "#1ECDB9",
    "backgroundColor": "#ffffff",
    "customize": true, // 这里设置该属性为true,即指定当前tabbar为自定义tabbar
    "items": [
      {
        "pagePath": "pages/index/index",
        "name": "候选人",
        "icon": "/assets/img/xcx_b_apply_normal.png",
        "activeIcon": "/assets/img/xcx_b_apply_active.png"
      },
      {
        "pagePath": "pages/imgCopper/index",
        "name": "职位",
        "icon": "/assets/img/xcx_b_job_normal.png",
        "activeIcon": "/assets/img/xcx_b_job_active.png"
      },
      {
        "pagePath": "pages/poster/index",
        "name": "",
        "icon": "https://qiniu-image.qtshe.com/miniapp_publish_job.png",
        "activeIcon": "https://qiniu-image.qtshe.com/miniapp_publish_job.png"
      },
      {
        "pagePath": "pages/canvas/index",
        "name": "消息",
        "icon": "/assets/img/xcx_b_job_normal.png",
        "activeIcon": "/assets/img/xcx_b_job_active.png"
      },
      {
        "pagePath": "pages/alipayMent/index",
        "name": "我的",
        "icon": "/assets/img/xcx_b_mine_normal.png",
        "activeIcon": "/assets/img/xcx_b__mine_active.png"
      }
    ]
  },
  "window": {
    "defaultTitle": "支付宝serverless拓荒"
  }
}

第二步:在pages同级新建一个customize-tab-bar组件,该组件就相当于一个自定义组件,内部代码如下:

// axml相关
<view class="tabbar_box">
  <view class="tabbar_nav {{index === 2 ? 'active' : ''}}" onTap="switchTab" data-index="{{index}}" data-item={{item}} a:for="{{tabBar.items}}" a:key="index">
    <!-- 图标 -->
    <image class="tabbar_icon" src="{{selected === index ? item.activeIcon : item.icon}}"></image>
    <!-- 文字 -->
    <text style="color:{{selected === index ? tabBar.selectedColor : tabBar.textColor}}" >{{item.name}}</text>
  </view>
</view>
// acss样式
.tabbar_box {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: horizontal;
  -webkit-box-direction: normal;
  -ms-flex-direction: row;
  flex-direction: row;
  -ms-flex-pack: distribute;
  justify-content: space-around;
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 999;
  width: 100%;
  box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0.2);
  background: #ffffff;
  padding-top: 16rpx;
  padding-bottom: env(safe-area-inset-bottom);
  box-sizing: content-box;
}

.tabbar_nav {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: space-around;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  font-size: 25rpx;
  height: 100%;
  flex: 1;
  background: #fff;
}

.tabbar_nav.active {
  padding-top: 50rpx;
}

.tabbar_nav.active image {
  width: 100rpx;
  z-index: 2;
  height: 100rpx;
  border-radius: 50%;
  line-height: 100rpx;
  font-size: 50rpx;
  top: -50rpx;
  left: 0;
  right: 0;
  margin: auto;
  padding: 0;
  position: absolute;
}

.tabbar_nav.active::after {
  content: "";
  position: absolute;
  width: 120rpx;
  height: 120rpx;
  top: -60rpx;
  left: 0;
  right: 0;
  margin: auto;
  box-shadow: 0 -3rpx 8rpx rgba(0, 0, 0, 0.06);
  border-radius: 60rpx;
  background-color: inherit;
  z-index: 0;
}

.tabbar_nav.active::before {
  content: "";
  position: absolute;
  width: 120rpx;
  height: 30rpx;
  bottom: 30rpx;
  left: 0;
  right: 0;
  margin: auto;
  background-color: inherit;
  z-index: 1;
}

.tabbar_icon {
  width: 40rpx;
  height: 40rpx;
}

.tabbar_nav text {
  font-size: 24rpx;
  margin-top: 6rpx;
}
// JS相关
Component({
data: {
selected: 0,
tabBar: {
textColor: "#6C6C6C",
selectedColor: "#1ECDB9",
items: [
{
pagePath: "/pages/index/index",
name: "候选人",
icon: "/assets/img/xcx_b_apply_normal.png",
activeIcon: "/assets/img/xcx_b_apply_active.png"
},
{
pagePath: "/pages/imgCopper/index",
name: "职位",
icon: "/assets/img/xcx_b_job_normal.png",
activeIcon: "/assets/img/xcx_b_job_active.png"
},
{
pagePath: "/",
name: "",
icon: "https://qiniu-image.qtshe.com/miniapp_publish_job.png",
activeIcon: "https://qiniu-image.qtshe.com/miniapp_publish_job.png"
},
{
pagePath: "/pages/canvas/index",
name: "消息",
icon: "/assets/img/xcx_b_job_normal.png",
activeIcon: "/assets/img/xcx_b_job_active.png"
},
{
pagePath: "/pages/alipayMent/index",
name: "我的",
icon: "/assets/img/xcx_b_mine_normal.png",
activeIcon: "/assets/img/xcx_b_mine_active.png"
}
]
}
},
methods: {
switchTab(e) {
const {dataset: { item: { pagePath = '' }} = {}} = e.target
my.switchTab({
url: pagePath
})
}
}
});



尝试过:记录selected的值缓存在内存里,onInit的时候再赋值,结果为:点击后页面跳转了,底部样式却未更新(改为reLaunch跳转可以解决,但是tabbar闪烁严重)。那么如何做解决呢?查看第三步。
第三步:通过 getTabBar 接口获取 tabBar 组件实例。在tabbar的页面onShow里手动赋值:

JavaScript

onShow() {
if (typeof this.getTabBar === "function" && this.getTabBar()) {
this.getTabBar().setData({
selected: 1 // 这里是tabbar下标,每个tabbar页面都需要写一下。
});
}
},


以上就是一个完整的自定义tabbar的实践效果,欢迎大家评论反馈问题。

目录
相关文章
|
30天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
30天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
12天前
|
小程序 前端开发 数据挖掘
圈子论坛社区交友系统开源版小程序源码,自定义小程序管理社区圈子软件开发,打造受欢迎社交圈
通过获取开源版小程序源码、进行自定义小程序管理社区圈子软件开发以及注重用户体验和功能模块的设计,可以打造一个受欢迎的社交圈。同时,需要不断优化和完善系统,以满足用户不断变化的需求和期望。
40 0
|
3月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
695 1
|
3月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
89 0
微信小程序:自定义关注公众号组件样式
|
5月前
|
小程序 开发者
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
本文介绍了如何在Taro项目中实现自定义tabBar。首先,在`app.config.ts`中设置`custom: true`并配置`tabBar`。
185 0
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
|
6月前
|
小程序 前端开发
【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
268 0
|
6月前
|
JSON 小程序 数据库
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
148 0
|
6月前
|
小程序 API
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
126 0
|
2天前
|
移动开发 小程序 前端开发
超详细攻略!uniapp陪玩系统,打包陪玩小程序、H5需要注意什么?
陪玩系统的打包过程涵盖APP、小程序和H5平台。APP打包需使用uni-app开发工具,配置项目信息并选择云打包;小程序打包需在微信公众平台注册账号并提交审核;H5打包则直接通过uni-app生成文件并上传至服务器。各平台需注意权限配置、代码规范及充分测试,确保应用稳定性和兼容性。