使用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>
相关推荐
jt君4242613 小时前
React Native JSI 深入剖析 — 第 5 部分中文技术整理:用 HostObject 把 C++ 类暴露给 JavaScript
前端·react native
胡萝卜术13 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试
fluffyox13 小时前
Notion 的公式栏里,藏着一台虚拟机——逆向 + 用 600 行 JS 复刻它的编译器与栈式 VM
前端
kyriewen15 小时前
2026 年了,这 6 个 npm 包可以卸载了——浏览器原生 API 已经能替代
前端·javascript·npm
铁皮饭盒16 小时前
bun直接tsx,优雅!
javascript·后端
Csvn17 小时前
Monorepo 迁移血泪史:从 Multi-Repo 到 Turborepo,这 3 个坑我帮你踩完了
前端
星栈17 小时前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
用户9874092388718 小时前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端
风骏时光牛马18 小时前
Less前端工程化实战:变量混合器与项目样式分层落地
前端
假如让我当三天老蒯18 小时前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试