likes
comments
collection
share

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

作者站长头像
站长
· 阅读数 72

前言

拖更了好久,在这里给大家说声抱歉。主要还是公司要求加班,每天的精力都被消耗殆尽,特别作者是一个业余的前端开发,写这个系列的文章,时间也要长一些。

同时,在写该章的时候,发现了前面的一个问题,在 BasicLayout.vuearticle 标签上,少添加了一个属性:flex,这里代码和文章已经进行了修改。下面言归正传。

通过前面的章节,我们实现了一个基本的布局,由左侧菜单栏和右侧内容栏组成,并实现了左侧菜单栏的基本功能。

实现之后的效果呢,如下图所示:

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

这一篇,来针对布局,做一下其他功能的完善,例如右侧Header等等。

添加Header栏

添加 Header 栏比较简单,打开 BasicLayout.vue 文件,在 article 标签中,修改如下:

<article flex-1 flex-col overflow-hidden>
  <header bg-blue-600 h-12>
    <div>
      <!-- 这是 Header 栏 -->
    </div>
  </header>
	<!-- section .... -->
</article>

添加一个 Header,简单为其添加一个背景和高度,刷新页面,基本的效果已经实现啦,效果如下:

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

完成之后,在 Header 右侧,添加一个头像按钮,修改代码如下:

<article flex-1 flex-col overflow-hidden>
  <header border-b h-12 leading-none>
    <n-space align="center" justify="end" :wrap="false" h-12 px-3>
      <n-avatar
        style="align-content: center"
        src="https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"
      />
    </n-space>
  </header>
	<!-- section -->
</article>

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

折叠菜单栏

NaiveUI 的 Menu 组件,提供了很方便的折叠功能,只需要控制折叠属性「collapsed」就可以了。所以,在使用菜单的地方, 添加该属性的值。修改 BasicLayout.vue 的代码:

<script setup lang="ts">
import { ref } from 'vue'
const collapsed = ref(false)
</script>

<template>
  <n-layout has-sider wh-full>
    <n-layout-sider
      bordered
      collapse-mode="width"
      :width="240"
      :native-scrollbar="false"
      :collapsed="collapsed"
      :collapsed-width="64"
    >
      <n-scrollbar>
        <n-menu
          :options="menuOptions"
          :expanded-keys="expandKeys"
          :on-update:expanded-keys="updateExpandKeys"
          :value="currentMenu"
          :on-update:value="updateValue"
          :collapsed="collapsed"
          :collapsed-width="64"
          :collapsed-icon-size="22"
          collapsed-mode="width"
        ></n-menu>
      </n-scrollbar>
    </n-layout-sider>
  </n-layout>
</template>

首先,定义一个 collapsed 属性,用于控制左侧菜单的折叠,分别在 NLayoutSiderNMenu 组件中,使用该折叠属性,并且定义这些的宽度等信息。之后,在 Header 中,定义一个图标,用于控制左侧菜单的折叠:

<header border-b h-12 leading-none>
  <n-space align="center" justify="space-between" :wrap="false" h-12 px-3>
    <n-icon size="24" cursor-pointer @click="collapsed = !collapsed">
      <PanelLeftExpand20Regular v-if="collapsed" />
      <PanelRightExpand20Regular v-else />
    </n-icon>
    <!-- ...... -->
  </n-space>
</header>

未折叠时效果如下:

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

已折叠时效果如下:

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

全局化配置

NaiveUI 提供了一个全局化配置组件(NConfigProvider)组件,可以方便地全局化配置内部组件的主题、语言和组件。首先,新建一个全局化配置组件页面:

  • components/AppProvider/AppProvider.vue
<template>
  <n-config-provider :locale="zhCN" :date-locale="dateZhCN" wh-full>
    <slot name="default" />
  </n-config-provider>
</template>

<script setup lang="ts">
import { zhCN, dateZhCN } from "naive-ui";
</script>
<style scoped></style>

在这个文件中,使用了 NConfigProvider 组件,并配置语言和日期语言为中文。

App.vue 中使用该组件页面:

<template>
	<AppProvider>
		<router-view></router-view>
	</AppProvider>
</template>

封装内容区域容器

在主内容区域,一直没有进行样式调整过,个人认为呢,在该区域时,可以封装几个通用的样式组件,当需要不同的样式时,加载不同的组件页面即可。

例如,这里封装几个不同需求的页面组件,从最基础的开始。

使用 SASS

SASS 是一款 CSS 的预处理语言,它在 CSS 语法的基础上增加了变量「variables」、嵌套「nested rule」、混合「mixins」、导入「inline imports」等高级功能。

使用 SASS 的方式比较简单,安装后,将样式文件定义为 .scss,即可使用相关语法。

首先,第一步,安装 SASS

pnpm i SASS -D

将前一章节定义的 index.css 重命名为 index.scss,相应 main.ts 中也进行重命名。

自定义滚动条

这里用 SASS 来实现一个自定义滚动条,美化下浏览器默认的滚动条样式,且支持组件内部滚动。

styles 文件夹下,增加 scroll.scss 样式文件,添加自定义滚动条样式:

/* 自定义滚动条样式 */
.cus-scroll {
  overflow: auto;
  &::-webkit-scrollbar {
    width: 8;
    height: 8px;
  }
}
.cus-scroll-x {
  overflow-x: auto;
  &::-webkit-scrollbar {
    width: 0;
    height: 8px;
  }
}
.cus-scroll-y {
  overflow-y: auto;
  &::-webkit-scrollbar {
    width: 8px;
    height: 0;
  }
}
.cus-scroll,
.cus-scroll-x,
.cus-scroll-y {
  &::-webkit-scrollbar-thumb {
    background-color: transparent;
    border-radius: 4px;
  }
  &:hover {
    &::-webkit-scrollbar-thumb {
      background: #bfbfbf;
    }
    &::-webkit-scrollbar-thumb:hover {
      background: var(--primary-color);
    }
  }
}

index.scss 中导入该文件:

@import 'scroll.scss';

基础布局

在 components 文件夹下,创建 Page 文件夹,在该文件夹下,创建 AppPage.vue 文件夹,表示一个最基础的页面组件。代码如下:

<script setup lang="ts"></script>

<template>
  <transition name="fade-slide" mode="out-in" appear>
    <section wh-full flex flex-col class="bg-[#f5f6fb] cus-scroll-y">
      <slot />
    </section>
  </transition>
</template>

<style scoped></style>

这个页面代码非常的简单,添加了动画效果,设置了高度、宽度、背景等,并且设置组件内部滚动。

这里,默认的过渡动画效果,不是非常满意,可以在 index.scss 中,进行修改:

/** ...... */

/* router view transition fade-slide */
.fade-slide-leave-active,
.fade-slide-enter-active {
  transition: all 0.4s
}

.fade-slide-enter-from {
  opacity: 0;
  transform: translateX(-30px);
}

.fade-slide-leave-to {
  opacity: 0;
  transform: translateX(30px);
}

自定义布局1

这里基于上面的基础布局,可以实现一个简单的自定义布局,例如如下:

  • components/Page/CommonPage.vue
<template>
  <app-page>
    <section flex-1 bg-light-50 m-2 p-2 rounded-md>
      <slot />
    </section>
  </app-page>
</template>

<script setup lang="ts"></script>

<style scoped></style>

在这个布局中,设置了边距、内边距、背景颜色和圆角等属性。

在使用时,非常简单,直接使用 common-page 标签即可,例如:

  • views/table/index.vue
<script setup lang="ts"></script>

<template>
  <common-page>
    <div>
      <h3>Table</h3>
      <router-link to="/dashboard">Go to Dashboard</router-link>
    </div>
  </common-page>
</template>

<style scoped></style>

实现效果如下:

手摸手创建一个 Vue + Ts 项目(六) —— 完善布局

结语

这一章节,完善了下布局,添加了 Header 栏,并实现了菜单折叠,头像展示的功能。还针对右侧内容栏,进行了最简单的样式封装,到此为止,基本实现了一个最简易的布局,可能有的开发者,还需要面包屑、多标签组件等等功能,之所以没有提及,是因为项目的初衷,就是最少的代码,实现最基本的功能,这种非基本的功能,会在后面单独讲一下,并将代码提交到新的分支。

我是「代码笔耕」,致力于打造高效简洁、稳定可靠代码的后端开发。 由于不是专业的前端开发,也是通过写这一系列的文章,来提升巩固下自己的水平。 本文可能存在纰漏或错误,如有问题欢迎指正,感谢您阅读这篇文章,如果觉得还行的话,不要忘记点赞、评论、收藏喔! 最后欢迎大家关注我的公众号「代码笔耕」和开源项目:easii (easii) - Gitee.com

转载自:https://juejin.cn/post/7250410050486485047
评论
请登录