使用vue3+ts+vite从零开始搭建bolg(五):layout(持续更新中)

五、layout搭建

5.1静态搭建

在src下创建如图文件夹

这里用logo举例,在scripts里export

javascript 复制代码
  <script lang="ts">
  export default {
    name: 'Logo',
  }
  </script>

然后在layout里引入

javascript 复制代码
//引入左侧菜单顶部用户信息
import Logo from './logo/index.vue'

接着直接使用

javascript 复制代码
<!-- 顶部用户信息 -->
      <Logo class="logo"></Logo>

以此类推,完成layout的静态搭建

5.2动态菜单

首先按照上述方法引入菜单

javascript 复制代码
<el-menu
        text-color="white"
        background-color="#001529"
        :default-active="$route.path"
        :collapse="LayOutSettingStore.fold ? true : false"
      >
        <Menu class="menu"></Menu>
</el-menu>

然后把菜单放入userStore里

javascript 复制代码
import { constantRoute } from '@/router/routes'

state: () => {
    return {
      token: GET_TOKEN(),
      username: '',
      menuRoutes:constantRoute,
    }
  },

再在Menu里,通过prop传到子组件

javascript 复制代码
<Menu :menuList="userStore.menuRoutes" class="menu"></Menu>

//引入用户相关的小仓库
import useUserStore from '../store/modules/user'
let userStore = useUserStore()

在menu的index.vue,定义并遍历

javascript 复制代码
<template>
    <div>
        <template v-for="item in menuList" :key="item.path">
            
        </template>
    </div>
</template>


defineProps(['menuList'])
没有子路由

即路由表里没有子路由

javascript 复制代码
<!--没有子路由-->
      <template v-if="!item.children">
        <el-menu-item
          v-if="!item.meta.hidden"
          :index="item.path"
          @click="goRoute"
        >
          <el-icon>
            <component :is="item.meta.icon"></component>
          </el-icon>
          <template #title>
            <span>{{ item.meta.title }}</span>
          </template>
        </el-menu-item>
      </template>

页面跳转goRoute方法

javascript 复制代码
import { useRouter } from 'vue-router'

let $router = useRouter()
const goRoute = (vc: any) => {
  $router.push(vc.index)
}
有子路由但是只有一个
javascript 复制代码
<!-- 有子路由但是只有一个的 -->
      <template v-if="item.children && item.children.length == 1">
        <el-menu-item
          v-if="!item.children[0].meta.hidden"
          :index="item.children[0].path"
          @click="goRoute"
        >
          <el-icon>
            <component :is="item.children[0].meta.icon"></component>
          </el-icon>
          <template #title>
            <span>{{ item.children[0].meta.title }}</span>
          </template>
        </el-menu-item>
      </template>
有子路由但是子路由大于一

采用递归的方法

javascript 复制代码
      <el-sub-menu
        :index="item.path"
        v-if="item.children && item.children.length > 1"
      >
        <template #title>
          <el-icon>
            <component :is="item.meta.icon"></component>
          </el-icon>
          <span>{{ item.meta.title }}</span>
        </template>
        <Menu :menuList="item.children"></Menu>
      </el-sub-menu>
相关推荐
sun007700几秒前
macvlan解决vlan路由冲突
前端·chrome
小oo呆1 分钟前
【自然语言处理与大模型】LangChainV1.0入门指南:AgentState介绍
前端·javascript·easyui
我是伪码农8 分钟前
电子时钟案例
javascript·css·css3
weixin_4624462312 分钟前
Electron 禁止复制粘帖
前端·javascript·electron
@小张在努力12 分钟前
Javascript中的闭包
开发语言·javascript·ecmascript
be or not to be13 分钟前
CSS 文本样式与阴影整理笔记
前端·css·笔记
辛-夷14 分钟前
js中如何改变this指向
开发语言·前端·javascript
门思科技15 分钟前
基于 LoRaWAN 的 CJ/T 188 M-Bus 热量表采集方案解析:KC22 与 Edge-Bus 的工程化实践
前端·edge
捻tua馔...15 分钟前
面试被问到-redux-toolkit用法
前端
qq_4634084219 分钟前
React Native跨平台技术在开源鸿蒙中使用内置的`fetch` API或者第三方库如`axHarmony`来处理网络通信HTTP请求
javascript·算法·react native·react.js·http·开源·harmonyos