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了

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3和TypeScript(TS)结合使用Element Plus来进行角色菜单分配,是一种很好的选择。下面是一个关于如何实现角色菜单分配的简单示例。 首先,我们需要安装Vue 3、TypeScript和Element Plus。可以使用npm命令进行安装。 ```bash npm install vue@next npm install typescript npm install element-plus ``` 然后,在Vue 3项目的入口文件中,可以引入Element Plus的模块,以及一些额外的样式文件。 ```javascript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 在组件中,我们可以使用Element Plus的Menu组件来展示菜单,并通过V-if指令来根据角色进行菜单项的展示与隐藏。 ```vue <template> <div> <el-menu> <el-menu-item v-if="hasAccess('dashboard')">仪表盘</el-menu-item> <el-menu-item v-if="hasAccess('users')">用户管理</el-menu-item> <el-menu-item v-if="hasAccess('roles')">角色管理</el-menu-item> </el-menu> </div> </template> <script> import { defineComponent } from 'vue' export default defineComponent({ data() { return { userRoles: ['dashboard', 'users', 'roles'] } }, methods: { hasAccess(role) { return this.userRoles.includes(role) } } }) </script> <style> /* 根据需要自定义样式 */ </style> ``` 在该示例中,假设用户角色以数组的形式存储在`userRoles`属性中。通过定义一个`hasAccess`方法,我们可以判断用户是否拥有某个角色,然后根据判断结果,在菜单项上使用V-if指令来展示或隐藏对应的菜单项。 当用户拥有某个角色时,该菜单项将会在界面上显示出来,反之,则不会显示。需要注意的是,需根据实际需求对示例中的角色判断逻辑进行调整。 这只是一个简单的示例,实际的角色菜单分配功能可能涉及到更复杂的逻辑和接口调用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值