跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Uniapp + Vue3 自定义 tabBar 实现方案

Uniapp 自定义 tabBar 方案主要解决原生样式受限问题。核心在于 pages.json 开启 custom 模式并保留 list 结构以防页面栈溢出。通过创建独立组件,利用 v-for 渲染图标,配合父组件传递的 currentIndex 属性控制高亮状态。点击事件统一使用 uni.switchTab 进行页面跳转,确保导航体验流畅且内存占用可控。

ApiHolic发布于 2026/4/5更新于 2026/10/24103 浏览

在 UniApp + Vue3 中实现自定义 tabBar

原生 tabBar 往往无法满足复杂的 UI 需求,通过自定义 tabBar 可以完全掌控样式和交互。但在实现时,需要注意页面栈的管理,避免内存溢出。

1. 基础配置

首先在 pages.json 中启用自定义 tabBar。虽然启用了 custom,但建议保留 tabBar 的 list 结构定义。这样做是为了利用 uni-app 底层的跳转机制,防止因频繁调用 navigateTo 导致页面栈无限增长。

如果连续点击切换,页面栈会迅速膨胀,增加崩溃风险。

{
  "tabBar": {
    "custom": true,
    "list": [
      {
        "pagePath": "pages/study/study",
        "text": "学习"
      },
      {
        "pagePath": "pages/mood/mood",
        "text": "情绪"
      }
    ]
  }
}

2. 组件开发

创建一个独立的 tabBar 组件。为了便于维护,建议使用 v-for 遍历列表数据。这里的关键是接收父组件传来的当前索引(currentIndex),用于判断高亮状态。

<script setup>
import { ref } from 'vue'

const props = defineProps({
  currentIndex: Number
})

// 定义 Tab 列表,需与 pages.json 保持一致
const tabBarList = ref([
  { pagePath: 'pages/study/study', text: '学习' },
  { pagePath: 'pages/mood/mood', text: '情绪' },
  { pagePath: 'pages/friend/friend', text: '研友' },
  { pagePath: 'pages/AI/AI', text: '芯研' },
  { pagePath: 'pages/my/my', text: '我的' }
])

// 处理点击事件,使用 switchTab 保证页面栈安全
const handleItemClick = (index) => {
  uni.switchTab({
    url: '/' + tabBarList.value[index].pagePath
  })
}
</script>

<template>
  <view class="container">
    <view 
      v-for="(item, index) in tabBarList" 
      :key="index" 
      class="item"
      @click="handleItemClick(index)"
    >
      <image 
        src="@/static/tabBar/学习.png" 
        style="width: 62rpx; height: 52rpx;" 
      />
      <view>{{ item.text }}</view>
      <!-- 根据索引控制高亮色块 -->
      <view class="circle" v-show="props.currentIndex === index"></view>
    </view>
  </view>
</template>

<style lang="scss" scoped>
.container {
  width: 100%;
  position: fixed !important;
  bottom: 0rpx;
  display: flex;
  justify-content: space-evenly;
  padding-bottom: 40rpx;
  background-color: white;
  z-index: 99999;
  
  .item {
    display: flex;
    flex-direction: column;
    gap: 10rpx;
    align-items: center;
    position: relative;
    
    .circle {
      position: absolute;
      top: -10rpx;
      left: 10rpx;
      width: 50rpx;
      height: 50rpx;
      background: rgba(255, 219, 217, 0.54);
      border-radius: 50%;
    }
  }
}
</style>

3. 页面集成

在每个需要显示 tabBar 的页面中引入该组件,并传递当前的页面索引。当页面加载时,记得重置组件内部状态,确保高亮位置准确。

实际开发中,建议在页面的 onLoad 或 onShow 生命周期中更新传入的索引值。这样用户每次进入页面,tabBar 都能正确反映当前所在页。

TabBar 效果示意 点击交互示意 高亮状态

目录

  1. 在 UniApp + Vue3 中实现自定义 tabBar
  2. 1. 基础配置
  3. 2. 组件开发
  4. 3. 页面集成

更多推荐文章

查看全部
  • OpenAI Whisper 语音转文字本地部署与使用指南
  • LeetCode 49 字母异位词分组详解
  • 红黑树从概念到手撕实现:平衡树的折中智慧
  • 二分查找进阶:寻找峰值、旋转数组最小值与缺失数字
  • 前端错误处理实战:try/catch、Promise 与业务异常分类
  • DeepSeek-R1 开源大模型推理优化实战:电商与金融场景落地方案
  • 基于 SpringBoot 的网上排课系统设计与实现
  • Python 并发编程实战:多线程与多进程详解
  • WebRTC 流媒体协议技术详解
  • Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查
  • llama-cpp-python 常见问题解决指南
  • 大模型应用科普:RAG 检索增强生成技术详解
  • Neo4j 数据导入实战:LOAD CSV、MATCH 与 MERGE 语法详解
  • LLM 训练详解:从预训练到微调与大模型应用
  • 快速排序非递归实现详解:手动模拟栈结构
  • 机场出租车调度问题的数学建模与仿真实现
  • 基于LLM的推荐系统用户兴趣迁移
  • 【论文阅读103】pinn-review-科学机器学习中的物理信息神经网络:现状与展望
  • 多模态文本智能技术:AI 语义理解与执行工程实现
  • 13个开发工具速览:从编辑器到部署的常用选择

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online