vue3+antdesginVue+ts解决导航菜单如何动态渲染antdesginVue自带的图标(icons-vue)以及导航菜单的刷新后继续锁定当前选中菜单问题 以及导航菜单动态生成问题

vue3+antdesginVue+ts解决导航菜单如何动态渲染antdesginVue自带的图标(icons-vue)以及导航菜单的刷新后继续锁定当前选中菜单问题 以及导航菜单动态生成问题

话不多说,先上效果图
在这里插入图片描述
main.ts

//带箭头的是重点
import { createApp, } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import Antd from "ant-design-vue";
import "ant-design-vue/dist/antd.css";
import * as echarts from "echarts";

import * as Icons from '@ant-design/icons-vue'//<==============================
const app = createApp(App);
app.config.globalProperties.$echarts = echarts;
app.use(store).use(router).use(Antd).mount("#app");

Object.keys(Icons).map(key => {//<==============================
  app.component(key, Icons[key as keyof typeof Icons])
})

页面使用

重点代码后面用 <==================== 这箭头都做了标注哦

<template>
  <div class="siderBox">
    <a-menu v-model:openKeys="openKeys" v-model:selectedKeys="selectedKeys" mode="inline" @openChange="onOpenChange">
      <template v-for="item in menuList" :key="item.key">
        <template v-if="!item.children">
          <a-menu-item :key="item.key" @click="goPath(item)">
            <template #icon>
              <component :is="item.icon"></component>   <===================================
            </template>
            {{ item.name }}
          </a-menu-item>
        </template>
        <template v-else>
          <a-sub-menu :key="item.key">
            <template #icon>
              <component :is="item.icon"></component> <===================================
            </template>
            <template #title>
              {{ item.name }}
            </template>
            <template v-for="inItem in item.children">
              <!-- 二层没孩子的 -->
              <a-menu-item v-if="!inItem.children" :disabled="inItem.disabled" :key="inItem.key" @click="goPath(inItem)">
                {{ inItem.name }}
              </a-menu-item>
              <!-- 二层有孩子的 -->
              <a-sub-menu v-if="inItem.children" :key="inItem.key">
                <template #title>{{ inItem.name }}</template>
                <template v-for="inItemTwo in inItem.children">
                  <!-- 三层没孩子的 -->
                <a-menu-item v-if="!inItemTwo.children" :disabled="inItemTwo.disabled" :key="inItemTwo.key"
                  @click="goPath(inItemTwo)">{{ inItemTwo.name }}</a-menu-item>
                  <!-- 三层有孩子的 -->
                  <a-sub-menu v-if="inItemTwo.children" :key="inItemTwo.key">
                    <template #title>{{ inItemTwo.name }}</template>
                    <!-- <template v-for="inItemThree in inItemTwo.children"> -->
                    <!-- 四层没孩子的 -->
                    <!-- <a-menu-item v-if="!inItemThree.children" :disabled="inItemThree.disabled"  :key="inItemThree.key">
                {{inItemThree.name}}
        </a-menu-item>-->
                    <!-- </template> -->
                  </a-sub-menu>
                </template>
              </a-sub-menu>
            </template>
          </a-sub-menu>
        </template>
      </template>
    </a-menu>
  </div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from "vue";
import { useRouter, useRoute } from "vue-router";
import {
  PieChartOutlined,
  AppstoreOutlined,
  SettingOutlined,
} from "@ant-design/icons-vue";
const router = useRouter();
const selectedKeys = ref<any>(["1"]);
const openKeys = ref<any>([]);
const menuList: any = [
  {
    name: "首页",
    key: "1",
    path: "/home",
    icon: "PieChartOutlined",//<=======================
  },
  {
    name: "温度监测",
    key: "2",
    icon: "AppstoreOutlined",//<=======================
    children: [
      { name: "A库", path: "/coldStorageA", key: "2.1" },
      { name: "B库", path: "/coldStorageB", key: "2.2" },
      { name: "C库", path: "/coldStorageC", key: "2.3" },
      { name: "D库", path: "/coldStorageD", key: "2.4" },
      { name: "E库", path: "/coldStorageE", key: "2.5" },
    ],
  },
  {
    name: "预警",
    key: "3",
    icon: "SettingOutlined",//<=======================
    children: [
      { name: "预警范围", path: "/rangeSetting", key: "3.1" },
    ],
  },
];
function goPath(item: any) {
  sessionStorage.setItem("menuKey", item.key);
  router.push({ path: item.path });
}
const onOpenChange = (openKeys: any) => {
  sessionStorage.setItem("openKeys", openKeys);
};
onMounted(() => {
  let menuKey = sessionStorage.getItem("menuKey");
  let menuOpenKeys = sessionStorage.getItem("openKeys");
  if (menuKey) selectedKeys.value = [menuKey];
  if (menuOpenKeys) openKeys.value = menuOpenKeys.split(",");
});
</script>

这样就OK了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值