构建Vue项目的侧边栏组件:Aside

构建Vue项目的侧边栏组件:Aside

在Vue项目中,侧边栏(Aside)是一个常见的组件,用于展示导航菜单。本文将详细介绍如何创建一个侧边栏组件,包括如何引入el-menu组件、定义路由、传递props以及编写MenuTree子组件等步骤。

1. 引入el-menu组件

首先,在Aside.vue中引入el-menu组件,用于构建侧边栏的菜单结构。

el-menu组件内部,添加一个用于显示侧边栏Logo的<p>标签。

3. 抽离MenuTree组件

为了更灵活地管理菜单数据,我们抽离出一个MenuTree组件,专门用于渲染菜单项和子菜单。

4. 定义路由

router/index.js文件中定义路由,并在对应的视图(view)页面中编写相应的内容。

5. Props传递

Aside.vue组件中,通过props向MenuTree组件传递菜单数据(menuData)和侧边栏收缩状态(isCollapse)。

使用useRouter获取路由信息

利用useRouter钩子获取路由信息,并从router.options.routes[0].children中提取出菜单数据,然后传递给MenuTree组件。

MenuTree.vue组件中,我们使用v-for指令遍历菜单数据,根据菜单项是否有子项来生成不同的菜单结构。

  • 无子菜单 :使用el-menu-item组件,并显示图标和文字。
  • 有子菜单 :使用el-sub-menu组件,并递归调用MenuTree组件来生成子菜单。

7. 使用RouterView展示路由后的页面

App.vueLayout.vue中使用RouterView组件来展示路由对应的页面内容。

8. 侧边栏的缩放功能

侧边栏的缩放功能还未完全实现,但已在Header部分预留了按钮用于控制侧边栏的收缩状态。

完整代码示例

Aside.vue

vue 复制代码
<template>
    <el-menu :default-active="$route.path" router :collapse="isCollapse">
        <p class="logo">{{ isCollapse ? 'W' : 'W陪诊' }}</p>
        <menu-tree :menuData="menuData" :isCollapse="isCollapse" />
    </el-menu>
</template>

<script setup>
import MenuTree from './components/MenuTree.vue'
import { useRouter } from 'vue-router'
import { ref, computed } from 'vue'
import { useMenuStore } from '@/stores'

const router = useRouter()
const menuData = router.options.routes[0].children
const menuStore = useMenuStore()
const isCollapse = computed(() => menuStore.menuIsCollapse)
</script>

<style scoped>
/* 样式代码 */
</style>

MenuTree.vue

vue 复制代码
<template>
    <div>
        <template v-for="(item, index) in props.menuData">
            <el-menu-item v-if="!item.children" :index="item.meta.path">
                <el-icon><component :is="item.meta.icon"></component></el-icon>
                <span>{{ isCollapse ? '' : item.meta.name }}</span>
            </el-menu-item>
            <el-sub-menu v-else :index="item.path">
                <template #title>
                    <el-icon><component :is="item.meta.icon"></component></el-icon>
                    <span>{{ isCollapse ? '' : item.meta.name }}</span>
                </template>
                <menu-tree :menuData="item.children" :isCollapse="isCollapse" />
            </el-sub-menu>
        </template>
    </div>
</template>

<script setup>
import { useRouter } from 'vue-router'
import { useMenuStore } from '@/stores'

const props = defineProps(['menuData', 'isCollapse'])
const router = useRouter()
const MenuStore = useMenuStore()

const handleClickMenu = (item) => {
    MenuStore.setTagList(item.meta)
}
</script>

通过上述步骤,我们可以成功地创建一个功能完备的侧边栏组件,为Vue项目提供清晰的导航结构。

相关推荐
coderHing[专注前端]2 分钟前
告别 try/catch 地狱:用三元组重新定义 JavaScript 错误处理
开发语言·前端·javascript·react.js·前端框架·ecmascript
UIUV18 分钟前
JavaScript中this指向机制与异步回调解决方案详解
前端·javascript·代码规范
momo10018 分钟前
IndexedDB 实战:封装一个通用工具类,搞定所有本地存储需求
前端·javascript
liuniansilence18 分钟前
🚀 高并发场景下的救星:BullMQ如何实现智能流量削峰填谷
前端·分布式·消息队列
再花18 分钟前
在Angular中实现基于nz-calendar的日历甘特图
前端·angular.js
San3025 分钟前
从零到一:彻底搞定面试高频算法——“列表转树”与“爬楼梯”全解析
javascript·算法·面试
GISer_Jing31 分钟前
今天看了京东零售JDS的保温直播,秋招,好像真的结束了,接下来就是论文+工作了!!!加油干论文,学&分享技术
前端·零售
Mapmost38 分钟前
【高斯泼溅】如何将“歪头”的3DGS模型精准“钉”在地图上,杜绝后续误差?
前端
JellyDDD40 分钟前
h5上传大文件可能会导致手机浏览器卡死,重新刷新的问题
javascript·上传文件
废春啊1 小时前
前端工程化
运维·服务器·前端