• vue3.0项目实战系列文章 - 菜单的实现及组件封装


    目录

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

     二、二次封装图标组件

    三、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. }

  • 相关阅读:
    我们是否真的需要k8s?
    linux查看dns命令
    0000-0002 UVa227 Puzzles UVa232 Crossword Answers UVA1368 DNA Consensus String
    解决hive表新增的字段查询为空null问题
    跟着GPT学设计模式之观察者模式
    Hash Table Mock
    【LeetCode动态规划#04】不同的二叉搜索树(找规律,有点像智力题)
    【Windows篇】Telnet指令介绍以及telnet测试端口连接示例
    antlr4例子步骤
    小白学习Java第四十天
  • 原文地址:https://blog.csdn.net/Hei_lovely_cat/article/details/126346644