vue3+TS实现APP底部导航栏TabBar

1.首先要创建文件

下面是我文件的创建路径

vite.config.ts

src\router.ts

src\constants\index.ts

src\components\templates\TabBar.vue

src\components\pages\Home.vue 

src\components\pages\Setting.vue

src\components\pages\Other.vue

图片路径:

src\assets\img\home_current.png
src\assets\img\home.png

src\assets\img\setting_current.png

src\assets\img\setting.png

src\assets\img\other_current.png

src\assets\img\other.png

2.下面一一展示每个文件的内容

  • vite.config.ts这个文件在根目录下,文件包含一些文件起别名的方法

  resolve: {
    alias: {
      "@": resolve(__dirname, "src"),
    },
  },
  • router.ts

import { createRouter, RouteRecordRaw, createWebHistory } from "vue-router";
import { PAGE_NAME, PAGE_URL } from "@/constants";
import Home from "@/components/pages/Home.vue";
import Setting from "@/components/pages/Setting.vue";
import Other from "@/components/pages/Other.vue";

const routes: Readonly<RouteRecordRaw[]> = [
  {
    path: PAGE_URL.HOME,
    component: Home,
    name: PAGE_NAME.HOME,
    meta: {
      keepAlive: true,
    },
  },
  {
    path: PAGE_URL.SETTING,
    component: Setting,
    name: PAGE_NAME.SETTING,
    meta: {
      keepAlive: true,
    },
  },
  {
    path: PAGE_URL.OTHER,
    component: Other,
    name: PAGE_NAME.OTHER,
    meta: {
      keepAlive: true,
    },
  },
  {
    path: "/:pathMatch(.*)",
    redirect: PAGE_NAME.HOME,
  },
];

const router = createRouter({ history: createWebHistory(), routes });

export { router };

  • index.ts

export const PAGE_URL = {
  HOME: "/home",
  SETTING: "/setting",
  OTHER: "/other",
};

export const PAGE_NAME = {
  HOME: "/home",
  SETTING: "/setting",
  OTHER: "/other",
};
  • TabBar.vue

<script setup lang="ts">
import { useRouter } from "vue-router";
import { PAGE_URL } from "@/constants";
import home from "@/assets/img/home.png";
import homeCurrent from "@/assets/img/home_current.png";
import setting from "@/assets/img/common/setting.png";
import settingCurrent from "@/assets/img/setting_current.png";
import other from "@/assets/img/other.png";
import otherCurrent from "@/assets/img/other_current.png";

const router = useRouter();

//转换图片和是否添加底部背景色
defineProps({
  homeActive: { type: Boolean, default: false },
  settingActive: { type: Boolean, default: false },
  otherActive: { type: Boolean, default: false },
})

</script>

<template>
  <div class="footer">
    <ul class="footer-list">
      <li
        class="current"
      >
        <!-- 点击跳转,添加背景颜色 -->
        <a
          class="a-link"
          :class="`${homeActive? 'active' : ''}`"
          :disabled="homeActive"
          @click="router.push(PAGE_URL.HOME )"
        >
          <div class="footer-list-img">
            <!-- 转换图片,当前有颜色的和无色的 -->
            <img
              :src="homeActive? homeCurrent : home "
              alt=""
              class="img-url"
            >
          <p>首页</p>
        </a>
      </li>

      <li>
        <a
          class="a-link"
          :class="`${settingActive? 'active' : ''}`"
          :disabled="settingActive"
          @click="router.push( PAGE_URL.SETTING)"
        >
          <div class="footer-list-img">
            <img
              :src="settingActive? settingCurrent : setting "
              alt=""
              class="img-url"
            >
          </div>
          <p>设置</p>
        </a>
      </li>

      <li>
        <a
          class="a-link"
          :class="`${otherActive? 'active' : ''}`"
          :disabled="otherActive"
          @click="router.push( PAGE_URL.OTHER)"
        >
          <div class="footer-list-img">
            <img
              :src="otherActive? otherCurrent : other "
              alt=""
              class="img-url"
            >
          </div>
          <p>其他</p>
        </a>
      </li>
    </ul>
  </div>
</template>

<style lang="scss" scoped>
.footer {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  background-color: #fff;
  box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.15);
}
.footer-list {
  display: flex;
  align-items: stretch;
  list-style: none;
  padding: 0;
  margin: 0;
}
.footer-list li {
  flex-basis: calc(100% / 3);
  padding: 4px;
}
.footer-list a {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  padding: 7px 0;
  border-radius: 10px;
}
a:hover,
a:visited {
  color: #222;
}
.footer-list-img{
  position: relative;
}
.active{
  background-color: #f3f3f9;
  }
.footer-list-img img {
  transition: all 0.3s ease;
  pointer-events: none;
}
.footer-list p {
  font-size: 11px;
  font-weight: 600;
  margin: 3px 0 0;
  line-height: 1;
  color: #666;
}
</style>

  • Home.vue 

<script setup lang="ts">
import TabBar from "@/components/templates/TabBar.vue";
</script>

<template>
  <div>我是首页</div>
  <TabBar :home-active="true" />
</template>

  • Setting.vue

<script setup lang="ts">
import TabBar from "@/components/templates/TabBar.vue";
</script>

<template>
  <div>我是设置页</div>
  <TabBar :setting-active="true" />
</template>
  • Other.vue

<script setup lang="ts">
import TabBar from "@/components/templates/TabBar.vue";
</script>

<template>
  <div>我是其他</div>
  <TabBar :other-active="true" />
</template>

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,针对你的问题,我可以给你一些思路和建议。首先,我们需要明确一下问题的背景和需求: 1. 多页面:指的是我们的项目中有多个页面,而不是单页应用(SPA)。 2. 共用底部导航栏:指的是我们需要在每个页面中都展示同一个底部导航栏,这个导航栏通常被称为 Tabbar。 基于以上需求,我们可以考虑使用 Vue.js 和 Vant UI 组件库来实现多页面共用底部导航栏。具体实现步骤如下: 1. 创建多个页面:在项目中创建多个页面,每个页面对应一个路由。这些页面可以是纯 HTML 页面,也可以是基于 Vue.js 框架开发的页面。 2. 定义底部导航栏组件:在 Vant UI 组件库中提供了 Tabbar 组件,我们可以使用这个组件来实现底部导航栏。在 Vue.js 中定义一个底部导航栏组件,将 Tabbar 组件作为该组件的一部分。 3. 在路由中引入底部导航栏组件:在每个页面的路由中引入底部导航栏组件,并将组件渲染在页面的底部。这样每个页面就都会展示同一个底部导航栏。 4. 处理底部导航栏的选中状态:由于底部导航栏是共用的,所以需要在不同的页面中处理导航栏的选中状态。我们可以通过路由的钩子函数来实现这一功能。比如在路由的 beforeEach 钩子函数中,根据当前路由的 path 来设置导航栏的选中状态。 以上就是实现多页面共用底部导航栏的大致思路和步骤。当然,具体的实现可能还需要根据项目的具体需求进行一些调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值