vue3+antd制作后台管理系统的左侧导航菜单

  • 导航菜单主页面
<template>
  <div :class="collapsed ? 'shrink' : 'open'">
    <a-button
      type="primary"
      @click="toggleCollapsed"
      class="buttonOpen"
      :style="{ marginLeft: collapsed ? '18px' : '10px' }"
    >
      <p v-if="collapsed" title="展开菜单"><MenuUnfoldOutlined /></p>
      <p v-else title="收拢菜单"><MenuFoldOutlined /></p>
    </a-button>
    <a-menu
      v-model:openKeys="openKeys"
      mode="inline"
      theme="dark"
      :inline-collapsed="collapsed"
      class="menu-class"
    >
      <template v-for="item in routerList" :key="item.name">
        <template v-if="item.meta.hidden"> // 首先根据meta里面的hidden属性判断是否显示,比如登录页面就不需要显示
          <template v-if="!item.children"> // 如果没有子菜单,显示的就应该是第一层菜单
            <a-menu-item :key="item.name">
              <PieChartOutlined />
              <span>{{ item.meta.title }}</span>
            </a-menu-item>
          </template>
          <template v-else> // 调用递归子组件
            <sub-menu :menu-info="item" :key="item.name" />
          </template>
        </template>
      </template>
    </a-menu>
  </div>
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs } from "vue";
import {
  MenuFoldOutlined,
  MenuUnfoldOutlined,
  PieChartOutlined,
} from "@ant-design/icons-vue";
import SubMenu from "./SubMenu.vue";
import { useRoute, useRouter } from "vue-router";
export default defineComponent({
  components: {
    "sub-menu": SubMenu,
    MenuFoldOutlined,
    MenuUnfoldOutlined,
    PieChartOutlined,
  },
  setup() {
    const router = useRouter();
    const route = useRoute();
    const data = reactive({
      collapsed: false,
      routerList: router.options.routes,
      openKeys: [],
      selectedKeys: [],
      toggleCollapsed() {
        if (!data.collapsed) (data.openKeys as any) = [];
        else (data.openKeys as any) = route.fullPath.split("/").slice(1);
        data.collapsed = !data.collapsed;
      },
    });

    return {
      ...toRefs(data),
    };
  },
});
</script>
<style lang="scss" scoped>
.shrink {
  width: 80px;
  transition: width 0.3s;
}
.open {
  width: 256px;
  transition: width 0.3s;
}
.menu-class {
  height: calc(100vh - 50px);
}
.buttonOpen {
  margin: 6px 0;
  // transition: all 0.3 !important;
}
</style>

  • 递归子组件
<template>
  <a-sub-menu :key="menuInfo.name" v-bind="$attrs">
    <template #title>
      <span>
        <MailOutlined />
        <span>{{ menuInfo.meta.title }}</span>
      </span>
    </template>
    <template v-for="item in menuInfo.children" :key="item.name">
      <template v-if="item.meta.hidden">
        <template v-if="!item.children">
          <a-menu-item :key="item.name">
            <PieChartOutlined />
            <span>
              {{ item.meta.title }}
            </span>
          </a-menu-item>
        </template>
        <template v-else> // 递归调用自身组件
          <sub-menu :menu-info="item" :key="item.name" />
        </template>
      </template>
    </template>
  </a-sub-menu>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { Menu } from 'ant-design-vue';

import { PieChartOutlined, MailOutlined } from "@ant-design/icons-vue";
export default defineComponent({
  name: "SubMenu",
  components: {
    PieChartOutlined,
    MailOutlined,
  },
  props: {
     ...Menu.SubMenu.props,
    menuInfo: {
      type: Object,
      default: () => ({}),
    },
  },
});
</script>

<style lang="scss" scoped></style>

截图一个router的写法
在这里插入图片描述
如果有根据后台获取展示菜单,则继续在meta中添加对应属性匹配即可,类似图上umark。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue3是一个流行的前端框架,具有高效的渲染和响应能力。antd一个基于Vue的UI组件库,提供了丰富的组件和样式。Vite是一个新的打包工具,具有更快的启动和热更新速度。 搭建一个后台项目,可以使用以下步骤: 1. 安装Node.js和npm,确保全局安装了@vue/cli。 2. 使用命令行工具创建一个新的Vue3项目:vue create my-project。 3. 选择手动配置,并选择Babel,Router,CSS Pre-processors,ESLint和Linter / Formatter。 4. 安装antd:npm install ant-design-vue@next。 5. 在src/main.js中引入antd的样式和组件:import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; 6. 在创建应用程序之前使用Antd组件:const app = createApp(App); app.use(Antd); app.mount('#app'); 7. 使用vite创建一个新的项目文件夹:mkdir my-project && cd my-project。 8. 在项目文件夹中初始化npm:npm init -y。 9. 安装vite:npm install vite。 10. 创建vite配置文件:npx create-vite。 11. 安装其他依赖:npm install axios vuex。 12. 在src/main.js中引入antd的样式和组件:import { createApp } from 'vue'; import App from './App.vue'; import Antd from 'ant-design-vue'; import 'ant-design-vue/dist/antd.css'; 13. 在创建应用程序之前使用Antd组件:const app = createApp(App); app.use(Antd).use(router).use(store).mount('#app')。 14. 运行开发服务器:npm run dev。 这样,你就成功搭建了一个使用Vue3、antd和vite的后台项目。你可以根据项目需求进行开发,并根据需要引入和使用更多的antd组件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值