当前位置: 首页 > article >正文

动态Tab导航

在 Vue 中,可以使用 Vue Router动态显示组件 的方式实现类似的局部导航功能。以下是一个完整的案例代码:

案例功能

  1. 底部的全局导航(“首页”、“商城”、“我的”)。
  2. 在“我的”页面中,有局部的 Tab 切换导航(“作品”、“私密”、“推荐”、“收藏”、“喜欢”)。

代码实现

1. 安装和初始化 Vue Router

确保你已经安装了 Vue Router:

npm install vue-router

2. 项目结构
src/
├── App.vue
├── main.js
├── components/
│   ├── GlobalFooter.vue    // 底部全局导航
│   ├── Tabs.vue            // 局部导航(“我的”页面专用)
├── views/
│   ├── Home.vue            // 首页
│   ├── Shop.vue            // 商城
│   ├── Profile.vue         // 我的页面
│       ├── TabsContent/
│           ├── Works.vue   // “作品”子页面
│           ├── Private.vue // “私密”子页面
│           ├── Recommend.vue // “推荐”子页面
│           ├── Collect.vue // “收藏”子页面
│           ├── Like.vue    // “喜欢”子页面
├── router/
│   ├── index.js            // 路由配置

3. 代码实现
App.vue
<template>
  <div id="app">
    <router-view /> <!-- 动态加载页面 -->
    <GlobalFooter /> <!-- 全局底部导航 -->
  </div>
</template>

<script>
import GlobalFooter from './components/GlobalFooter.vue';
export default {
  components: {
    GlobalFooter,
  },
};
</script>

<style>
/* 全局样式 */
</style>

router/index.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from '../views/Home.vue';
import Shop from '../views/Shop.vue';
import Profile from '../views/Profile.vue';

const routes = [
  { path: '/', name: 'Home', component: Home },
  { path: '/shop', name: 'Shop', component: Shop },
  { path: '/profile', name: 'Profile', component: Profile },
];

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

export default router;

GlobalFooter.vue
<template>
  <div class="footer">
    <router-link to="/">首页</router-link>
    <router-link to="/shop">商城</router-link>
    <router-link to="/profile">我的</router-link>
  </div>
</template>

<style scoped>
.footer {
  position: fixed;
  bottom: 0;
  width: 100%;
  background-color: #f5f5f5;
  display: flex;
  justify-content: space-around;
  padding: 10px 0;
  border-top: 1px solid #ccc;
}
</style>

Profile.vue(“我的”页面)
<template>
  <div>
    <Tabs @tab-change="handleTabChange" />
    <component :is="currentTab" /> <!-- 动态渲染子组件 -->
  </div>
</template>

<script>
import Tabs from '../components/Tabs.vue';
import Works from './TabsContent/Works.vue';
import Private from './TabsContent/Private.vue';
import Recommend from './TabsContent/Recommend.vue';
import Collect from './TabsContent/Collect.vue';
import Like from './TabsContent/Like.vue';

export default {
  components: {
    Tabs,
    Works,
    Private,
    Recommend,
    Collect,
    Like,
  },
  data() {
    return {
      currentTab: 'Works', // 默认显示“作品”
    };
  },
  methods: {
    handleTabChange(tab) {
      this.currentTab = tab;
    },
  },
};
</script>

Tabs.vue(局部导航栏)
<template>
  <div class="tabs">
    <button
      v-for="tab in tabs"
      :key="tab.value"
      :class="{ active: currentTab === tab.value }"
      @click="changeTab(tab.value)"
    >
      {{ tab.label }}
    </button>
  </div>
</template>

<script>
export default {
  props: {
    defaultTab: {
      type: String,
      default: 'Works',
    },
  },
  data() {
    return {
      tabs: [
        { label: '作品', value: 'Works' },
        { label: '私密', value: 'Private' },
        { label: '推荐', value: 'Recommend' },
        { label: '收藏', value: 'Collect' },
        { label: '喜欢', value: 'Like' },
      ],
      currentTab: this.defaultTab,
    };
  },
  methods: {
    changeTab(tab) {
      this.currentTab = tab;
      this.$emit('tab-change', tab); // 通知父组件切换 Tab
    },
  },
};
</script>

<style scoped>
.tabs {
  display: flex;
  justify-content: space-around;
  background-color: #f5f5f5;
  padding: 10px 0;
  border-bottom: 1px solid #ccc;
}

button {
  background: none;
  border: none;
  font-size: 16px;
  cursor: pointer;
}

button.active {
  font-weight: bold;
  color: #007bff;
}
</style>

子页面示例(Works.vue)
<template>
  <div>
    <h2>作品页面</h2>
    <p>这里是作品的内容。</p>
  </div>
</template>

其他子页面(Private.vueRecommend.vue 等)可以按照类似结构实现。


样式优化

  1. 固定顶部导航:在 Tabs.vue 添加 position: sticky 或者结合 z-index 实现悬浮效果。
  2. 动态路由高亮:可以根据 Vue Routerroute.name 来实现。

如果需要更高级的效果(例如动画切换),可以使用 Vue Transition 或第三方动画库(如 Animate.css)。


http://www.kler.cn/a/401929.html

相关文章:

  • ISUP协议视频平台EasyCVR私有化部署视频平台如何实现RTMP推流将大疆无人机的视频画面回传?
  • C 语言标准库 - <stdlib.h>
  • 如何创建一个项目用于研究element-plus的原理
  • 详细解读CNAS实验室认证
  • 移动应用开发:使用Android Studio 实现登录页与注册页跳转
  • 【后端】版本控制
  • STM32G4的数模转换器(DAC)功能介绍
  • Linux-shell实例手册-服务操作
  • 基于YOLOv8深度学习的智慧农业猪行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • SpringSecurity+jwt+captcha登录认证授权总结
  • ARM CCA机密计算安全模型之简介
  • 网络IPC:套接字汇总整理
  • 2411rust,编译时自动检查配置
  • 贴代码框架PasteForm特性介绍之select,selects,lselect和reload
  • Python入门(9)--类与对象基础
  • 30. 并发编程
  • Go 编译代码-分平台编译
  • Kubernetes配置管理ConfigMap、Secret
  • 51单片机基础01 单片机最小系统
  • freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题
  • 【大选】2024年美国总统选举数据分析可视化
  • HbuilderX的使用
  • 从零开始学习JVM(九)- 垃圾收集器
  • 【逐行注释】MATLAB的EKF和UKF例程与详细注释|附下载链接
  • LDR6500:C to DP与DP to C视频转接线双向方案
  • RTK技术算法概述!