【每周一个小技巧】支付宝小程序自定义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的实践效果,欢迎大家评论反馈问题。

目录
相关文章
|
2月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
490 1
|
5月前
|
小程序 开发者
【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)
【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)
61 0
|
2月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
65 0
微信小程序:自定义关注公众号组件样式
|
4月前
|
小程序 开发者
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
本文介绍了如何在Taro项目中实现自定义tabBar。首先,在`app.config.ts`中设置`custom: true`并配置`tabBar`。
143 0
Taro@3.x+Vue@3.x+TS开发微信小程序,使用自定义tabBar
|
5月前
|
小程序 前端开发
【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)
228 0
|
5月前
|
JSON 小程序 数据库
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
【微信小程序-原生开发】实用教程14 - 列表的分页加载,触底加载更多(含无更多数据的提醒和显示,自定义组件)
131 0
|
5月前
|
小程序 API
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
【微信小程序-原生开发】实用教程07 - Grid 宫格导航,详情页,侧边导航(含自定义页面顶部导航文字)
103 0
|
5月前
|
小程序 JavaScript
【微信小程序-原生开发】实用教程03-自定义底部导航(含自定义tabBar导航高亮需点击两次的解决方案)
【微信小程序-原生开发】实用教程03-自定义底部导航(含自定义tabBar导航高亮需点击两次的解决方案)
144 0
|
6月前
|
小程序 前端开发 Java
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
(JAVA)支付宝小程序登录相关(authToken获取用户唯一userId、encryptedData解密手机号)
442 0
|
2月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
263 3