Vue3+TypeScript搭建最基础的后台管理系统(含tabs设计)

主页面:放置所有底层内容

复制代码
<template>
  <div class="wrapper">
    <el-container>
      <el-header><Header></Header></el-header>
      <el-container>
        <el-aside style="width: 200px;"><Sidebar></Sidebar></el-aside>
        <el-main class="mainClass">
          <Tabs></Tabs>
          <router-view/>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>



<script setup lang="ts">
import Header from '@/components/Manager/mainFirstComponents/header.vue';
import Sidebar from '@/components/Manager/mainFirstComponents/sidebar.vue';
import Tabs from '@/components/Manager/mainFirstComponents/tabs.vue';
</script>

<style scoped>
.wrapper {
  height: 100vh;
  overflow: hidden;
}
.mainClass{
  margin: 15px;
  border: 2px solid #1abc9c; /* 绿色边框 */
  border-radius: 12px; /* 圆角效果 */
  background-color: #f9fafb; /* 背景色,稍微浅一点的颜色 */
  box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); /* 阴影效果 */
  max-width: 90%; /* 限制最大宽度 */
  height: 90vh;
}
</style>

侧边导航栏:

tabs:实现标签路由管理

复制代码
<template>
  <el-tabs
      v-model="activeTab"
      type="card"
      @tab-click="handleTabClick"

  >
    <el-tab-pane
        v-for="(tab, index) in tabs"
        :key="tab.index"
        :label="tab.title"
        :name="tab.index"
    >
      <template #label>
        <span>{{ tab.title }}</span>
        <span
            @click.stop="closeTab(index)"
        >
          ×
        </span>
      </template>
    </el-tab-pane>
  </el-tabs>
</template>

<script setup lang="ts">
import { onMounted, ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';

const activeTab = ref('/manager');
const tabs = ref([
  { index: '/manager', title: '系统首页' },
]);

const route = useRoute();
const router = useRouter();

onMounted(() => {
  router.push('/manager');
});

// 监听路由变化并更新选中的标签
watch(() => route.path, (newPath) => {
  const tabExists = tabs.value.find((tab) => tab.index === newPath);
  if (!tabExists) {
    tabs.value.push({ index: newPath, title: route.name });
  }
  activeTab.value = newPath;
});

// 处理标签点击事件,进行路由跳转
const handleTabClick = (tab: { index: string }) => {
  router.push(tab.props.name);
};

// 关闭标签并跳转到下一个
const closeTab = (index: number) => {
  const tabToClose = tabs.value[index];
  tabs.value.splice(index, 1);

  // 如果关闭的是当前选中的标签,则自动跳转到下一个标签
  if (activeTab.value === tabToClose.index) {
    activeTab.value = tabs.value[index]?.index || tabs.value[index - 1]?.index || '/';
    router.push(activeTab.value);
  }
};
</script>

<style scoped>

</style>

静态路由:

复制代码
    {
      path: "/manager",
      component: () => import('@/components/Manager/MainFirstPage.vue'),
      children: [
        {
          name:'课程管理页',
          path: "courseManage",
          component: () => import('@/components/Manager/courseManage.vue')
        },
        {
          name:'测试页',
          path: "managerMainPage",
          component: () => import('@/components/Manager/managerMainPage.vue')
        },
      ],
    },
相关推荐
赵民勇16 分钟前
ES5中prototype和prototype.constructor详解
javascript
C_心欲无痕24 分钟前
ts - 模板字面量类型与 `keyof` 的魔法组合:`keyof T & `on${string}`使用
linux·运维·开发语言·前端·ubuntu·typescript
Van_captain26 分钟前
rn_for_openharmony常用组件_Tabs选项卡
javascript·开源·harmonyos
赵民勇27 分钟前
ES6中的const用法详解
javascript·es6
一勺菠萝丶29 分钟前
Java 后端想学 Vue,又想写浏览器插件?
java·前端·vue.js
Irene199136 分钟前
Vue 3中:setup 函数接收两个重要参数:props 和 context(附:setup 中无法访问 this 详解)
vue.js·setup
念你那丝微笑42 分钟前
uView Plus + Vue3 + TypeScript + UniApp 正确引入 UnoCSS(避坑版)
vue.js·typescript·uni-app
Van_captain1 小时前
React Native for OpenHarmony Toast 轻提示组件:自动消失的操作反馈
javascript·开源·harmonyos
内存不泄露1 小时前
基于Spring Boot和Vue的宠物医院管理系统设计与实现
vue.js·spring boot·信息可视化
Van_captain1 小时前
React Native for OpenHarmony Modal 模态框组件:阻断式交互的设计与实现
javascript·开源·harmonyos