【vue3后台项目】实现Layout的架构

212 阅读1分钟

创建基于Layout的基础架构

Layout页面结构图: image.png

1.整个页面分为3部分,首先去创建对应的3个组件:

  • layout/components/Sidebar/index.vue
  • layout/components/Navbar.vue
  • layout/components/AppMain.vue

2.然后在layout/index.vue中引入这3个组件:

<script setup>
import Sidebar from './components/Sidebar/index.vue'
import Navbar from './components/Navbar.vue'
import AppMain from './components/AppMain.vue'
</script>

3.完成对应的布局结构:

<template>
  <div class="app-wrapper">
    <Sidebar class="sidebar-container" />
    <div class="main-container">
      <div class="fixed-header">
        <!--顶部header-->
        <Navbar />
      </div>
      <!--内容区-->
      <AppMain />
    </div>
  </div>
</template>

4.在styles中创建scss文件:

  • variables.scss:定义常量
  • mixin.scss:定义通用的css
  • sidebar.scss:处理menu菜单的样式

5.为variables.scss定义如下常量并导出;

// sidebar
$menuText: #bfcbd9;
$menuActiveText: #ffffff;
$subMenuActiveText: #f4f4f5;

$menuBg: #304156;
$menuHover: #263445;

$subMenuBg: #1f2d3d;
$subMenuHover: #001528;

$sideBarWidth: 210px;

// Js与scss共享变量,在scss中通过:export进行导出,在js中可通过ESM进行导入
:export {
  menuText: $menuText;
  menuActiveText: $menuActiveText;
  subMenuActiveText: $subMenuActiveText;
  menuBg: $menuBg;
  menuHover: $menuHover;
  subMenuBg: $subMenuBg;
  subMenuHover: $subMenuHover;
  sideBarWidth: $sideBarWidth;
}

6.为mixin.scss定义如下样式:

@mixin clearfix {
  /**选中它的父亲*/
  &:after {
    content: '';
    display: table;
    clear: both;
  }
}

@mixin scrollBar {
  &::-webkit-scrollbar-track-piece {
    background: #d3dce6;
  }

  &::-webkit-scrollbar {
    width: 6px;
  }

  &::-webkit-scrollbar-thumb {
    background: #99a9bf;
    border-radius: 20px;
  }
}

@mixin relative {
  position: relative;
  width: 100%;
  height: 100%;
}

7.sidebar.scss样式:

#app {
  .sidebar-container {
    width: 300px;
    background-color: pink;
  }
}

8.在index.scss中按照顺序导入以上样式文件;

@import './variables.scss';
@import './mixin.scss';
@import './sidebar.scss';

9.在layout/index.vue中写入如下样式;

<style lang="scss" scoped>
@import '~@/styles/mixin.scss';
@import '~@/styles/variable.scss';

.app-wrapper {
  height: 100vh;
  display: flex;
}
.main-container {
  flex-grow: 1;
}
</style>

我这里遇到一个问题, variables.scss导出variables为空对象,我这里改为variables.module.scss文件名就解决了这个问题;

10.因为将来要实现主题更换,所以为sidebar赋值动态的背景颜色:

<Sidebar
  class="sidebar-container"
  :style="{ backgroundColor: variables.menuBg }"
/>

11.为Navbar、Sidebar、AppMain组件进行初始化代码;

给APPMain添加样式;

<style lang="scss" scoped>
    .app-main {
      min-height: calc(100vh - 50px);
      overflow: hidden;
      padding: 60px 20px 20px 20px;
      box-sizing: border-box;
    }
</style>

12.此时的效果:

image.png