一:前言

        本文主要是针对刚上手 Vue3 的初学者所写。涉及内容比较简单,没有太过于复杂的逻辑。因此有想学神入知识的可以看一下别的文章。

        本次实验的技术是 Vue3 + TypeScript + Element Plus 。因为这三个是在 Vue 开发中经常一起出现的。如果没有学过的话也不要紧,逻辑大体是一样的,不妨碍阅读。

        这里附上 Gitee 开源地址,有想要实践一下又懒得写代码的小伙伴可以直接下载运行。同时在本系列 Vue3 学习中,后续代码也都会更新在这个 Gitee 库中。

二:开发

涉及的 Element Plus 组件:

  • 布局容器:el-container
  • 单选:el-radio-group
  • 菜单:el-sub-menu
  • 面包屑:el-breadcrumb

项目目录如下:

各文件代码

1、views 下的 index.vue 

        该页面是用户的首页,其使用了布局容器,菜单等组件,以及自己封装的注入底部标签等。后续我们进行开发的时候,都是在<el-main>标签中开发,可以使用一个<keep-alive>进行缓存路由等。 

<template>
  <div class="common-layout">
    <!-- 设置布局格式,做菜单,右边上中下是,头,内容,脚 -->
    <el-container>
      <el-aside width="200px"><navbar></navbar></el-aside>
      <el-container class="container">
        <el-header><breadcrumb></breadcrumb></el-header>
        <el-main>这里是主页的内容</el-main>
        <el-footer><footers></footers></el-footer>
      </el-container>
    </el-container>
  </div>
</template>

<script setup>
import { ElButton, ElInput } from 'element-plus'
import { ref } from 'vue'
import navbar from '@/components/navbar.vue'
import breadcrumb from '@/components/breadcrumb.vue'
import footers from '@/components/footers.vue'

</script>


<style>
.common-layout{
  margin-top: 15px;
}
.container{
  padding:5px 0 0 15px;
}
.input {
  display: inline;
  margin: 20px 30px;
}

.button {
  width: 90px;
}
</style>

2、navbar组件

        这个组件是我们右侧的菜单组件,目前的话是使用的纯静态来写的,后续会进行完善,届时通过配置路由的方式来同步菜单。 

<template>
    <el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
      <el-radio-button :label="false">expand</el-radio-button>
      <el-radio-button :label="true">collapse</el-radio-button>
    </el-radio-group>
    <el-menu
      default-active="2"
      class="el-menu-vertical-demo"
      :collapse="isCollapse"
      @open="handleOpen"
      @close="handleClose"
    >
      <el-sub-menu index="1">
        <template #title>
          <el-icon><location /></el-icon>
          <span>Vue3 练习</span>
        </template>
        <el-menu-item-group>
          <template #title><span>主要知识点</span></template>
          <el-menu-item index="1-1">store</el-menu-item>
          <el-menu-item index="1-2">Router</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="次级知识点">
          <el-menu-item index="1-3">Elements Plus</el-menu-item>
        </el-menu-item-group>
        <el-sub-menu index="1-4">
          <template #title><span>打包</span></template>
          <el-menu-item index="1-4-1">Vite知识</el-menu-item>
        </el-sub-menu>
      </el-sub-menu>
      <el-menu-item index="2">
        <el-icon><icon-menu /></el-icon>
        <template #title>TypeScript</template>
      </el-menu-item>
      <el-menu-item index="3" disabled>
        <el-icon><document /></el-icon>
        <template #title>Vite</template>
      </el-menu-item>
      <el-menu-item index="4">
        <el-icon><setting /></el-icon>
        <template #title>Pina</template>
      </el-menu-item>
    </el-menu>
  </template>
  
  <script lang="ts" setup>
  import { ref } from 'vue'
  import {
    Document,
    Menu as IconMenu,
    Location,
    Setting,
  } from '@element-plus/icons-vue'
  
  const isCollapse = ref(true)
  const handleOpen = (key: string, keyPath: string[]) => {
    console.log(key, keyPath)
  }
  const handleClose = (key: string, keyPath: string[]) => {
    console.log(key, keyPath)
  }
  </script>
  
  <style>
  .el-menu-vertical-demo:not(.el-menu--collapse) {
    width: 200px;
    min-height: 400px;
  }
  </style>
  

3、breadcrumb组件

        该组件同样是使用的 Element Plus 自带的面包屑组件,一样是静态的,后面应当根据路由守卫,进行跳转配置标签。

<template>
    <el-breadcrumb separator="/">
      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item
        ><a href="/">promotion management</a></el-breadcrumb-item
      >
      <!-- <el-breadcrumb-item>promotion list</el-breadcrumb-item>
      <el-breadcrumb-item>promotion detail</el-breadcrumb-item> -->
    </el-breadcrumb>
  </template>
  

4、footers

        页脚组件是我们自己封装的,可以根据自己的喜欢来设置布局,只是一些简单的CSS样式。由于我们这里还没有写太多的内容,因此没有吧这个放在最下面,不然会有些不美观。有需要的小伙伴可以将CSS中注释掉的两行代码解开。 

<template>
    <div class="app-foot">
        {{ footerMsgCopyright }}
        <span class="source">{{ footerMsgName }}</span>
    </div>
</template>
<script setup>
    // 版权说明的文字
    const footerMsgCopyright = 'Copyright © 2020-2021 xxxx平台 - Powered By ';
    // 单位
    const footerMsgName = 'xxxx实验室'
</script>

<style scoped>
.app-foot {
    /* footer 固定在页面底部 */
    min-height: 35px;
    background-color: #eeeeee;
    width: 100%;
    font-size: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    /* position: fixed; */
    /* bottom: 0px; */
}

.source {
    font-weight: 600;
}
</style>

5、router下的index.ts

        这个是路由配置页面,没有了解过路由配置的小伙伴可以参考我之前的文章。

Vue3路由配置-CSDN博客 

import { createRouter, createWebHistory } from 'vue-router'

const routes = [
  {
    path: '/',
    name: 'index',
    component: () => import('../views/index.vue')
  }
]

const router = createRouter({
  // history: createWebHistory(process.env.BASE_URL),
  history: createWebHistory(import.meta.env.BASE_URL),
  routes
})

export default router

三:总结

        这篇文章是很简单的,写的东西也都是非常基础的,并没有进行很复杂的传值等。刚上手的小伙伴可以琢磨一下。最后把项目的gitee地址放上去,需要的小伙伴可以自行下载。

乾辰/vue3全家桶练习icon-default.png?t=N7T8https://gitee.com/qianchen12138/vue3-family-bucket-practice

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐