微信小程序(uniapp)自定义 TabBar

微信小程序(uniapp)自定义 TabBar 实现指南

在微信小程序开发中,TabBar 是底部导航栏的重要组件,但官方提供的 TabBar 样式和功能较为基础,无法满足所有项目的需求。本文将详细介绍如何在 uniapp 中实现自定义 TabBar,并提供完整的实现思路和代码示例。


一、自定义 TabBar 的实现思路
  1. 隐藏原生 TabBar
    pages.json 文件中,将 tabBar 配置项设置为空或移除,从而隐藏原生 TabBar。

  2. 创建自定义 TabBar 组件
    在项目中创建一个全局组件,用于渲染自定义的 TabBar。

  3. 动态切换页面内容
    使用 uni.switchTabuni.navigateTo 方法切换页面,同时控制 TabBar 的选中状态。

  4. 全局管理 TabBar 状态
    通过 Vuex 或全局变量管理当前选中的 TabBar 项,确保状态同步。


二、实现步骤
1. 隐藏原生 TabBar

pages.json 文件中,移除或注释掉 tabBar 配置:

{"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页"}},{"path": "pages/mine/mine","style": {"navigationBarTitleText": "我的"}}],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "uni-app","navigationBarBackgroundColor": "#FFFFFF","backgroundColor": "#FFFFFF"},// "tabBar": {}
2. 创建自定义 TabBar 组件

components 目录下创建 CustomTabBar.vue 文件:

<template><view class="tab-bar"><viewv-for="(item, index) in tabList":key="index"class="tab-item":class="{ active: currentTab === index }"@click="switchTab(index, item.path)"><image :src="currentTab === index ? item.iconActive : item.icon" class="tab-icon" /><text>{{ item.text }}</text></view></view>
</template>
export default {data() {return {currentTab: 0,tabList: [{ text: "首页", path: "/pages/index/index", icon: "/static/home.png", iconActive: "/static/home-active.png" },{ text: "我的", path: "/pages/mine/mine", icon: "/static/mine.png", iconActive: "/static/mine-active.png" }]};},methods: {switchTab(index, path) {this.currentTab = index;uni.switchTab({ url: path });}}
};
.tab-bar {position: fixed;bottom: 0;width: 100%;height: 50px;background-color: #ffffff;display: flex;justify-content: space-around;align-items: center;border-top: 1px solid #eaeaea;
}
.tab-item {text-align: center;flex: 1;
}
.tab-item.active {color: #007aff;
}
.tab-icon {width: 24px;height: 24px;
}

完整代码:

<template><view class="tab-bar"><viewv-for="(item, index) in tabList":key="index"class="tab-item":class="{ active: currentTab === index }"@click="switchTab(index, item.path)"><image :src="currentTab === index ? item.iconActive : item.icon" class="tab-icon" /><text>{{ item.text }}</text></view></view>
</template><script>
export default {data() {return {currentTab: 0,tabList: [{ text: "首页", path: "/pages/index/index", icon: "/static/home.png", iconActive: "/static/home-active.png" },{ text: "我的", path: "/pages/mine/mine", icon: "/static/mine.png", iconActive: "/static/mine-active.png" }]};},methods: {switchTab(index, path) {this.currentTab = index;uni.switchTab({ url: path });}}
};
</script><style>
.tab-bar {position: fixed;bottom: 0;width: 100%;height: 50px;background-color: #ffffff;display: flex;justify-content: space-around;align-items: center;border-top: 1px solid #eaeaea;
}
.tab-item {text-align: center;flex: 1;
}
.tab-item.active {color: #007aff;
}
.tab-icon {width: 24px;height: 24px;
}
</style>
3. 在页面中引入自定义 TabBar

在需要显示 TabBar 的页面中,引入并使用该组件。例如,在 pages/index/index.vue 中:

<template><view class="page"><view class="content"><!-- 页面内容 --></view><custom-tab-bar /></view>
</template><script>
import CustomTabBar from "@/components/CustomTabBar.vue";export default {components: {CustomTabBar}
};
</script><style>
.page {padding-bottom: 50px; /* 留出 TabBar 的空间 */
}
.content {/* 页面内容样式 */
}
</style>
4. 全局状态管理(可选)

如果项目中有多个页面需要共享 TabBar 的选中状态,可以使用 Vuex 或全局变量来管理 currentTab

三、注意事项
  1. 页面高度调整
    由于自定义 TabBar 是固定在页面底部的,因此需要在页面内容中留出足够的空间,避免内容被 遮挡。
  2. 图标资源路径
    确保图标资源的路径正确,并且支持不同分辨率的设备。
  3. 性能优化
    自定义 TabBar 组件会在每个页面中重复渲染,建议将组件逻辑封装为通用组件,减少重复代码。
  4. 兼容性
    自定义 TabBar 的实现方式在小程序和 H5 环境中均可使用,但需要注意不同平台的样式差异。
四、总结

通过隐藏原生 TabBar 并使用自定义组件,开发者可以灵活实现符合项目需求的 TabBar 样式和功能。同时,通过全局状态管理和样式优化,可以进一步提升项目的可维护性和用户体验。

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

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

相关文章

MLP实战二:MLP 实现图像数字多分类

任务 实战&#xff08;二&#xff09;&#xff1a;MLP 实现图像多分类 基于 mnist 数据集&#xff0c;建立 mlp 模型&#xff0c;实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入&#xff0c;可视化图形数字&#xff1b; 2、完成数据预处理&#xff1a;图像数据维度转换与…

BUUCTF[HCTF 2018]WarmUp 1题解

BUUCTF[HCTF 2018]WarmUp 1题解 分析解题过程代码审计主体函数CHECK函数&#xff1a; 构造payload 总结 分析 启动靶机&#xff0c;进入网址&#xff0c;是一张滑稽的表情包&#xff1a; 程序化F12查看源码&#xff1a; 发现注释内容&#xff0c;访问 url:/source.php得到…

大陆4D毫米波雷达ARS548调试

本文介绍了大陆ARS548毫米波雷达的调试与测试流程&#xff0c;主要包括以下内容&#xff1a; 设备参数&#xff1a;最大检测距离301m&#xff08;可调93-1514m&#xff09;&#xff0c;支持gPTP时间同步。 接线调试&#xff1a; Windows需使用USB-RJ45转换器 Linux可直接连接网…

TDengine 的 AI 应用实战——运维异常检测

作者&#xff1a; derekchen Demo数据集准备 我们使用公开的 NAB数据集 里亚马逊 AWS 东海岸数据中心一次 API 网关故障中&#xff0c;某个服务器上的 CPU 使用率数据。数据的频率为 5min&#xff0c;单位为占用率。由于 API 网关的故障&#xff0c;会导致服务器上的相关应用…

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…

《一生一芯》数字实验三:加法器与ALU

1. 实验目标 设计一个能实现如下功能的4位带符号位的 补码 ALU&#xff1a; Table 4 ALU 功能列表  功能选择 功能 操作 000 加法 AB 001 减法 A-B 010 取反 Not A 011 与 A and B 100 或 A or B 101 异或 A xor B 110 比较大小 If A<B then out1…

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…

Java并发编程实战 Day 10:原子操作类详解

【Java并发编程实战 Day 10】原子操作类详解 开篇 这是“Java并发编程实战”系列的第10天&#xff0c;我们将深入探讨原子操作类的核心技术——CAS原理、ABA问题以及原子类的实现机制。通过理论结合代码实践的方式&#xff0c;帮助读者理解并掌握如何在实际工作中高效使用原子…

瀚文机械键盘固件开发详解:HWKeyboard.h文件解析与应用

【手把手教程】从零开始的机械键盘固件开发&#xff1a;HWKeyboard.h详解 前言 大家好&#xff0c;我是键盘DIY爱好者Despacito0o&#xff01;今天想和大家分享我开发的机械键盘固件核心头文件HWKeyboard.h的设计思路和技术要点。这个项目是我多年来对键盘固件研究的心血结晶…

2048游戏的技术实现分析-完全Java和Processing版

目录 简介Processing库基础项目构建指南项目结构核心数据结构游戏核心机制图形界面实现性能优化代码详解设计模式分析测试策略总结与展望简介 2048是一款由Gabriele Cirulli开发的经典益智游戏。本文将深入分析其Java实现版本的技术细节。该实现使用了Processing库来创建图形界…

Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统

Spring Boot Elasticsearch HBase 构建海量数据搜索系统 &#x1f4d6; 目录 1. 系统需求分析2. 系统架构设计3. Elasticsearch 与 HBase 集成方案4. Spring Boot 项目实现5. 大规模搜索系统最佳实践 项目概述 本文档提供了基于 Spring Boot、Elasticsearch 和 HBase 构建…

【iOS】YYModel源码解析

YYModel源码解析 文章目录 YYModel源码解析前言YYModel性能优势YYModel简介YYClassInfo解析YYClassIvarInfo && objc_ivarYYClassMethodInfo && objc_methodYYClassPropertyInfo && property_tYYClassInfo && objc_class YYClassInfo的初始化细…

宇树科技更名“股份有限公司”深度解析:机器人企业IPO前奏与资本化路径

从技术落地到资本跃迁&#xff0c;拆解股改背后的上市逻辑与行业启示 核心事件&#xff1a;股改释放的上市信号 2025年5月28日&#xff0c;杭州宇树科技有限公司正式更名“杭州宇树科技股份有限公司”&#xff0c;市场主体类型变更为“股份有限公司”。尽管官方称为常规运营调…

Android Native 内存泄漏检测全解析:从原理到工具的深度实践

引言 Android应用的内存泄漏不仅发生在Java/Kotlin层&#xff0c;Native&#xff08;C/C&#xff09;层的泄漏同样普遍且隐蔽。由于Native内存不受Java虚拟机&#xff08;JVM&#xff09;管理&#xff0c;泄漏的内存无法通过GC自动回收&#xff0c;长期积累会导致应用内存占用…

Vortex GPGPU的github流程跑通与功能模块波形探索(四)

文章目录 前言一、demo的输入文件二、trace_csv三、2个值得注意的点3.1 csv指令表格里面的tmask&#xff1f;3.2 rtlsim和simx的log文件&#xff1f; 总结 前言 跟着前面那篇最后留下的几个问题接着把输出波形文件和csv文件的输入、输出搞明白&#xff01; 一、demo的输入文件…

UnityPSD文件转UI插件Psd2UnityuGUIPro3.4.0u2017.4.2介绍:Unity UI设计的高效助手

UnityPSD文件转UI插件Psd2UnityuGUIPro3.4.0u2017.4.2介绍&#xff1a;Unity UI设计的高效助手 【下载地址】UnityPSD文件转UI插件Psd2UnityuGUIPro3.4.0u2017.4.2介绍 这款开源插件将PSD文件无缝转换为Unity的UI元素&#xff0c;极大提升开发效率。它支持一键转换&#xff0c;…

力扣100题之128. 最长连续序列

方法1 使用了hash 方法思路 使用哈希集合&#xff1a;首先将数组中的所有数字存入一个哈希集合中&#xff0c;这样可以在 O(1) 时间内检查某个数字是否存在。 寻找连续序列&#xff1a;遍历数组中的每一个数字&#xff0c;对于每一个数字&#xff0c; 检查它是否是某个连续序列…

Java爬虫技术详解:原理、实现与优势

一、什么是网络爬虫&#xff1f; 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网络蜘蛛或网络机器人&#xff0c;是一种自动化程序&#xff0c;能够按照一定的规则自动浏览和抓取互联网上的信息。爬虫技术是大数据时代获取网络数据的重要手段&#xff0c;广泛…

神经网络与深度学习 网络优化与正则化

1.网络优化存在的难点 &#xff08;1&#xff09;结构差异大&#xff1a;没有通用的优化算法&#xff1b;超参数多 &#xff08;2&#xff09;非凸优化问题&#xff1a;参数初始化&#xff0c;逃离局部最优 &#xff08;3&#xff09;梯度消失&#xff08;爆炸&#xff09; …

【汇编逆向系列】二、函数调用包含单个参数之整型-ECX寄存器,LEA指令

目录 一. 汇编源码 二. 汇编分析 1. ECX寄存器 2. 栈位置计算​ 3. 特殊指令深度解析 三、 汇编转化 一. 汇编源码 single_int_param:0000000000000040: 89 4C 24 08 mov dword ptr [rsp8],ecx0000000000000044: 57 push rdi0000…