微信小程序开发---自定义底部tabBar

自定义tabBar注意事项:

  • 在自定义 tabBar 模式下 ,为了保证低版本兼容以及区分哪些页面是 tab 页,app.json文件中 tabBar 的相关配置项需完整声明,但这些字段不会作用于自定义 tabBar 的渲染。
  • 所有 tabBar 的样式都由该自定义组件渲染。推荐用 fixed 在底部的 cover-view + cover-image 组件渲染样式,以保证 tabBar 层级相对较高。(不使用也没关系)
  • 与 tabBar 样式相关的接口,如 wx.setTabBarItem 等将失效。
  • 每个 tab 页下的自定义 tabBar 组件实例是不同的,可通过自定义组件下的 getTabBar 接口,获取当前页面的自定义 tabBar 组件实例。例如:如需实现 tab 选中态,要在当前页面下,通过 getTabBar 接口获取组件实例,并调用 setData 更新选中态。

实现步骤:

1. 配置信息

  • 在 app.json 中的 tabBar 项指定 custom 字段值为 true,同时其余 tabBar 相关配置也补充完整。
  • 所有 tab 页的 json 里需声明 usingComponents 项,也可以在 app.json 全局开启。
  • 代码示例 ( app.json中的配置项):
    "tabBar": {"custom": true,"color": "#000000","selectedColor": "#CBB486","borderStyle": "white","list": [{"pagePath": "pages/member-announce/index","text": "公告","iconPath": "/public/img/icon-announce.png","selectedIconPath": "/public/img/icon-announce-selected.png"},{"pagePath": "pages/member-operation/index","text": "活动","iconPath": "/public/img/icon-operation.png","selectedIconPath": "/public/img/icon-operation-selected.png"},{"pagePath": "pages/space-map/index","text": "空间","iconPath": "/public/img/icon-spaceNew.png","selectedIconPath": "/public/img/icon-space-selectedNew.png"},{"pagePath": "pages/member-center/index","text": "我的","iconPath": "/public/img/icon-centerNew.png","selectedIconPath": "/public/img/icon-center-selectedNew.png"}]},

其中 iconPath 代表未被选中时的 icon 图标,selectedIconPath 代表当前被选中时的  icon图标。

2. 添加 tabBar 代码文件

  • 在代码根目录下添加入口文件 
    • 文件名必须为 custom-tab-bar
    • 必须在根目录处添加(与page文件同级)
custom-tab-bar/index.js
custom-tab-bar/index.json
custom-tab-bar/index.wxml
custom-tab-bar/index.wxss

3. 编写tabBar代码

自定义组件的方式编写即可,该自定义组件完全接管 tabBar 的渲染。另外,自定义组件新增 getTabBar 接口,可获取当前页面下的自定义 tabBar 组件实例。

4. 实现tabBar选中态:

在 tabBar 所在页面的 js或ts 文件中的onShow方法写入:

onShow() {if (typeof this.getTabBar === 'function' && this.getTabBar()) {this.getTabBar().setData({selected: 0 // 当前页面所在数据的索引值})}},

大家可根据上述步骤一步步实现,下面是我的代码demo。先配置好上述步骤中标红的1、2,再赋值下面代码,最后再在每个tabBar所在的页面配置好选中态,再根据项目需求调整即可。

自定义 tabBar 代码示例分享:

custom-tab-bar文件中的index.wxml:

<view class="tab-bar"><view wx:for="{{list}}" wx:key="index" class="tab-bar-item {{item.bulge?'bulge':''}}" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab"><view wx:if="{{item.bulge}}" class="tab-bar-bulge tab-bar-view"></view><image class="image" src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image><view wx:if="{{item.text}}" style="color: {{selected === index ? selectedColor : color}}" class="tab-bar-view">{{item.text}}</view></view>
</view>

custom-tab-bar文件中的index.ts:(我这里用的是ts,用js的伙伴稍微改一下类型就可以)

Component({data: {color: "#545454",selectedColor: "#CBB486",backgroundColor: "#fff",list:[{pagePath: "/pages/member-announce/index",text: "公告",iconPath: "/public/img/icon-announce.png",selectedIconPath: "/public/img/icon-announce-selected.png"},{pagePath: "/pages/member-operation/index",text: "活动",iconPath: "/public/img/icon-operation.png",selectedIconPath: "/public/img/icon-operation-selected.png"},{pagePath: "",bulge: true,iconPath: "/public/img/icon-chat-ai.png",selectedIconPath: "/public/img/icon-chat-ai.png"},{pagePath: "/pages/space-map/index",text: "空间",iconPath: "/public/img/icon-spaceNew.png",selectedIconPath: "/public/img/icon-space-selectedNew.png"},{pagePath: "/pages/member-center/index",text: "我的",iconPath: "/public/img/icon-centerNew.png",selectedIconPath: "/public/img/icon-center-selectedNew.png"},],},methods: {switchTab(e: { currentTarget: { dataset: any } }) {const data = e.currentTarget.datasetconst url = data.pathif (url === '') {const token = wx.getStorageSync("token");wx.navigateTo({ url: token ? "/pages/member-chat-ai/index" : "/pages/login/index" });} else {console.log(url);wx.switchTab({ url });}}}
})

custom-tab-bar文件中的index.wxss:

.tab-bar {position: fixed;bottom: 0;left: 0;right: 0;/* 兼容 iOS < 11.2 */height: calc(96rpx + constant(safe-area-inset-bottom));/* 兼容 iOS >= 11.2 */height: calc(96rpx + env(safe-area-inset-bottom));background: #fff;display: flex;box-shadow: 0px -10rpx 12rpx rgba(0, 0, 0, 0.08);
}.tab-bar-item {flex: 1;text-align: center;display: flex;justify-content: center;align-items: center;flex-direction: column;
}.tab-bar-item .image {width: 48rpx;height: 48rpx;
}.bulge {background-color: #fff;
}.bulge .image {position: absolute;width: 96rpx;height: 96rpx;top: 13rpx;
}.tab-bar-item .tab-bar-view {font-size: 20rpx;
}

custom-tab-bar文件中的index.json:

{"component": true
}

不要忘记设置选中态:

底部效果如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x86 汇编中的 “lock“ 指令详解

在深入理解 “lock” 指令之前&#xff0c;我们先来看一下 Qt 源代码中的一段 x86 汇编代码&#xff1a; q_atomic_increment:movl 4(%esp), %ecxlock incl (%ecx)mov $0,%eaxsetne %alret.align 4,0x90.type q_atomic_increment,function.size q_atomic_increment,.-q_atom…

网工常见面试题

1-10题 1.介绍TCP/IP四层、五层模型作用及每层包含的协议 TCP/IP四层模型 应用层&#xff1a; 作用&#xff1a;直接与应用程序交互&#xff0c;定义了应用程序如何通过网络发送数据。包含协议&#xff1a;HTTP&#xff08;网页浏览&#xff09;、FTP&#xff08;文件传输&…

Linux学习笔记:前言与操作系统的初识【1】

前言 为什么学习Linux 作为当下最流行的操作系统之一&#xff0c;学会如何使用和操作Linux操作系统也就是每位计算机学者的看家必备技能了。其次呢&#xff0c;本人受Linux的创始人林纳斯的影响太深了&#xff0c;觉得这个人太了不起了&#xff0c;而且人家大学里就自研开发出…

javascript的toFixed()以及使用

toFixed() 是 JavaScript 中数字类型&#xff08;Number&#xff09;的一个方法&#xff0c;用来将数字转换为指定小数位数的字符串表示形式。 使用方式和示例&#xff1a; let num 123.45678; let fixedNum num.toFixed(2); console.log(fixedNum); // 输出 "123.46&qu…

【Gradio】构建自定义多模态聊天机器人

这是我们构建自定义多模态聊天机器人组件两部分系列的第一部分。在第一部分中&#xff0c;我们将修改 Gradio 聊天机器人组件&#xff0c;使其能够在同一消息中显示文本和媒体文件&#xff08;视频、音频、图片&#xff09;。在第二部分中&#xff0c;我们将构建一个自定义的文…

深度解析RocketMq源码-持久化组件(一) MappedFile

1. 绪论 rocketmq之所以能够有如此大的吞吐量&#xff0c;离不开两个组件&#xff0c;一个是利用netty实现的高性能网络通信组件&#xff1b;另一个就是利用mmap技术实现的存储组件。而在rocketmq的存储组件中主要有三个组件&#xff0c;分别是持久化文件commitLog&#xff0c…

音樂大模型的崛起:技術革新與行業變革

音樂大模型的崛起&#xff1a;技術革新與行業變革 在過去的一個月中&#xff0c;隨著多個音樂大模型的輪番上線&#xff0c;音樂創作的門檻驟然降低&#xff0c;使得普通人也能輕鬆創作出高質量的音樂作品。這一技術進步引發了廣泛的討論&#xff0c;尤其是在音樂圈內&#xf…

多模态MLLM都是怎么实现的(10)-Chameleon和Florence-2如果你想玩多模态就不能不了解

这个也是一个补充文&#xff0c;前9章基本把该讲的讲了&#xff0c;今天这个内容主要是因为Meta出了一个Chameleon&#xff0c;这个以后可能会成为LLaMA的一个很好的补充&#xff0c;或者说都有可能统一起来&#xff0c;叫LLaMA或者Chamleon或者什么别的&#xff0c;另外我司把…

【图解IO与Netty系列】Netty源码解析——事件循环

Netty源码解析——事件循环 Netty事件循环源码解析select()processSelectedKeys()NioMessageUnsafe#read()NioByteUnsafe#read() runAllTasks() Netty事件循环 当Netty服务端启动起来以后&#xff0c;就可以接受客户端发送的请求&#xff0c;接收到客户端发来的请求后就会有事…

计算机网络 交换机的VLAN配置

一、理论知识 1.VLAN的定义 ①VLAN虚拟局域网&#xff0c;是一种通过将局域网内的设备逻辑地而不是物理地划分成一个个网段从而实现虚拟工作组的技术。 ②IEEE于1999年颁布了用以标准化VLAN实现方案的802.1Q协议标准草案。 ③VLAN技术允许网络管理者将一个物理的LAN逻辑地划…

【Ruby简单脚本02】双色球系统

# frozen_string_literal: true require date # 生成中奖号码的工具 # 红球 1-32 篮球 1-15 def create_num nums [] 6.times do while true num rand(1..32) unless nums.include?(num) nums << num break end end end blue rand(1..15) nums…

MySQL存储管理(一):删数据

从表中删除数据 从表中删除数据&#xff0c;也即是delete过程。 什么是表空间 表空间可以看做是InnoDB存储引擎逻辑结构的最高层&#xff0c;所有的数据都存放在表空间中。默认情况下&#xff0c;InnoDB存储引擎有一个共享表空间idbdata1&#xff0c;即所有数据都存放在这个表…

无限滚动表格

纵向无限滚动 单元格内部横向滚动 <!--* Description: 横向、纵向滚动表格* Author: liyanfeng liyanfenghopewind.com* Date: 2024-06-15 16:06:57* LastEditors: liyanfeng liyanfenghopewind.com* LastEditTime: 2024-06-20 17:15:37* FilePath: \plus-ui\src\componen…

Gone框架介绍33 - HTTP 注入说明

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 HTTP 注入说明HTTP 依赖注入标签的格式支持注入的类型和响应标签Query参数注入属性类型为简单类型[1]属性类型为简…

SEO是什么?SEO相关发展历史

一、SEO是什么意思&#xff1f; SEO&#xff08;Search Engine Optimization&#xff09;&#xff0c;翻译成中文就是“搜索引擎优化”。简单来讲&#xff0c;seo是指自然搜索结果下获得的网站流量的技术&#xff0c;是可以不用花钱就可以让自己的网站有好的排名&#xff0c;也…

关于Redis知识的理解

系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 文章目录 Redis的由来一、Redis数据类型的发展…

SpringTask Cron表达式

Cron表达式格式 1.Cron表达式格式 Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&#xff0c;Cron有如下两种语法格式&#xff1a; 秒 分 时 一个月第几天 月 一个星期第几天 年 &…

fegin返回参数统一处理

相关版本: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version></parent><properties><spring-cloud.version>2023.0.0</spri…

C语言:生命周期和作用域,static和extern

关键字static与extern 1.作用域&#xff08;scope&#xff09;&#xff1a;代码中能够访问到变量的范围&#xff08;变量可以被使用的文本区间&#xff09;。&#xff08;分为全局作用域和局部作用域&#xff09; ☺全局作用域&#xff1a;在整个程序中都能访问的变量。通常…

C语言入门系列:数据类型转换

文章目录 一&#xff0c;自动类型转换1&#xff0c;赋值运算1.1&#xff0c;浮点数赋值给整型变量-不安全1.2&#xff0c;整数赋值给浮点数变量-安全1.3&#xff0c;窄类型赋值给宽类型-安全1.4&#xff0c;宽类型赋值给窄类型-不安全 2&#xff0c;混合类型的运算2.1&#xff…