当前位置:   article > 正文

vue3.0项目实战系列文章 - 菜单的实现及icon组件封装_el-menu-item 带图标展示

el-menu-item 带图标展示

目录

一、先看下实现效果,然后注意几点

 二、二次封装图标组件

三、menu文件


一、先看下实现效果,然后注意几点

  • 图标是动态变化的,需要二次封装组件实现
  • 写法与vue2有所区别 

 二、二次封装图标组件

  • 图标是动态变化的,需要二次封装组件实现 
  • 注意引入的版本及写法,我引入的是"element-plus": "^2.2.13",以作参考

1.路径:src>components>modules>icon.vue

2.main.js引入,注意与vue2.0有所区别

  1. //全局使用方法 vue2.0:Vue.component('el-icons', icons)
  2. //图标
  3. import icons from '@/components/modules/icon.vue'
  4. app.component('el-icons', icons) //使用时候元素的名称,进行注册的组件名

 3.icon.vue

  1. <template>
  2. <el-icon :size="size" :color="color">
  3. <component :is="name"></component>
  4. </el-icon>
  5. </template>
  6. <script>
  7. import { ref, defineComponent } from "vue";
  8. import * as Icons from '@element-plus/icons-vue'
  9. // import * as ElementPlusIconsVue from '@element-plus/icons-vue'
  10. export default defineComponent({
  11. components: Icons,
  12. name: "ElIcons",
  13. props: {
  14. name: {
  15. type: String,
  16. required: true,
  17. },
  18. size: {
  19. type: String,
  20. default: "",
  21. },
  22. color: {
  23. type: String,
  24. default: "",
  25. },
  26. },
  27. });
  28. </script>

4.使用

<el-icons :name="item.icon"  />

三、menu文件

1.源文件

  1. <template>
  2. <div class="sidebar">
  3. <el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="collapse" text-color="#333333"
  4. active-text-color="#20a0ff" unique-opened router>
  5. <template v-for="item in items">
  6. <template v-if="item.subs">
  7. <el-submenu :index="item.index" :key="item.index">
  8. <template #title>
  9. <el-icons :name="item.icon" />
  10. <span>{{ item.title }}</span>
  11. </template>
  12. <template v-for="subItem in item.subs" :key="subItem.index">
  13. <el-submenu v-if="subItem.subs" :index="subItem.index">
  14. <template #title>{{ subItem.title }}</template>
  15. <el-menu-item v-for="(threeItem, i) in subItem.subs" :key="i" :index="threeItem.index">
  16. {{ threeItem.title }}</el-menu-item>
  17. </el-submenu>
  18. <el-menu-item v-else :index="subItem.index">{{ subItem.title }}
  19. </el-menu-item>
  20. </template>
  21. </el-submenu>
  22. </template>
  23. <template v-else>
  24. <el-menu-item :index="item.index" :key="item.index">
  25. <el-icons :name="item.icon" />
  26. <template #title>{{ item.title }}</template>
  27. </el-menu-item>
  28. </template>
  29. </template>
  30. </el-menu>
  31. </div>
  32. </template>
  33. <script lang="ts" setup>
  34. import {
  35. computed,
  36. watch
  37. } from "vue";
  38. import {
  39. useStore
  40. } from "vuex";
  41. import {
  42. useRoute
  43. } from "vue-router";
  44. const items = [{
  45. icon: "HomeFilled",
  46. index: "/role",
  47. title: "角色管理",
  48. }, {
  49. icon: "Menu",
  50. index: "/menu",
  51. title: "菜单管理",
  52. },
  53. {
  54. icon: "Tools",
  55. index: "/jurisdiction",
  56. title: "权限管理",
  57. },
  58. ] as any[];
  59. const route = useRoute();
  60. const onRoutes = computed(() => {
  61. return route.path;
  62. });
  63. const store = useStore();
  64. const collapse = computed(() => store.state.collapse);
  65. </script>
  66. <style scoped>
  67. .sidebar {
  68. display: block;
  69. position: absolute;
  70. left: 0;
  71. top: 70px;
  72. bottom: 0;
  73. overflow-y: scroll;
  74. }
  75. .sidebar::-webkit-scrollbar {
  76. width: 0;
  77. }
  78. .sidebar-el-menu:not(.el-menu--collapse) {
  79. width: 250px;
  80. }
  81. .sidebar>ul {
  82. height: 100%;
  83. }
  84. </style>

修改样式:创建elementUi.css

main.js引入

 elementUi.css:

  1. /* 导航菜单 */
  2. /* 移动背景色 */
  3. .el-menu-item:hover {
  4. background-color: #CBE6F5 !important;
  5. color: #20a0ff!important;
  6. }
  7. .el-menu-item:hover i {
  8. color: #20a0ff!important;
  9. }
  10. .el-menu-item i {
  11. color: #909399;
  12. margin-right: 5px;
  13. width: 24px;
  14. }
  15. /* 子菜单 */
  16. .el-submenu .el-menu-item {
  17. background-color: #F9F9F9;
  18. color: #666666!important;
  19. }
  20. .el-menu-item.is-active{
  21. background-color: #CBE6F5;
  22. color: #20a0ff!important;
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/113133
推荐阅读