Bootstrap

Vue实训---3-element plus的使用与布局

1.引入ElementPlus

ElementPlus官网指南:快速开始 | Element Plus

在我们的项目main.js文件中,加入红框里的内容:

import { createApp } from 'vue'
import App from './App.vue'
// 引入全局样式,是对样式的初始化
import "@/assets/less/index.less"
// 引入路由
// import router from './router'
import router from '@/router/index.js'
// 引入 element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

// 将之前的createApp(App).mount('#app') 拆开写,并在其中引入路由
// 创建vue实例
const app = createApp(App)
// 注入路由
app.use(router)
// 注入 element-plus
app.use(ElementPlus)
// 挂载到DOM上
app.mount('#app')

2.简单使用ElementPlus组件

ElementPlus官网对于每种组件都给出了代码示例。

例如:Button 按钮 | Element Plus中,

 将官网示例代码粘贴到我们的App.vue中,顺便对#app设置全局样式:

<script setup>

</script>

<template>
    <router-view></router-view>
    <div>
        <el-button>Default</el-button>
        <el-button type="primary" plain>Primary plain</el-button>
        <el-button type="success">Success</el-button>
        <el-button type="info">Info</el-button>
        <el-button type="warning" round>Warning round</el-button>
        <el-button type="danger" :icon="Delete" circle> 危险</el-button>
    </div>
</template>

<style> 
/* scoped的作用是只在当前组件生效,我们这里设置的是全局样式,所以去掉scoped */、
/* 设置样式,让app组件占满整个屏幕,为什么是#app,因为我们在main.js中挂载的根组件就是#app,这样设置就是让根组件占满整个屏幕,不让页面显示滚动条*/
#app {
    width: 100%;
    height: 100%;
    overflow: hidden;
}
</style>

在vscode终端运行命令:

npm run dev

浏览器显示:

效果出现后,可以将这些el-button代码删掉,这样就不会影响我们后续的项目。

3.使用ElementPlus图标

3.1 引入图标

官网Icon 图标 | Element Plus中给出了图标的引入方式:

我们将这些代码加入到main.js中:

import { createApp } from 'vue'
import App from './App.vue'
// 引入全局样式,是对样式的初始化
import "@/assets/less/index.less"
// 引入路由
// import router from './router'
import router from '@/router/index.js'
// 引入 element-plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 引入 element-plus 的图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'

// 将之前的createApp(App).mount('#app') 拆开写,并在其中引入路由
// 创建vue实例
const app = createApp(App)
// 注入路由
app.use(router)
// 注入 element-plus
app.use(ElementPlus)
// 注入 element-plus 的图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}
// 挂载到DOM上
app.mount('#app')
3.2 ElementPlus页面布局

Container 布局容器 | Element Plus中给出了示例。

我们选择下图的示例:

我们期望将Main.vue文件做成下图的样子:

修改Main.vue文件,将官网代码复制过来,然后加上样式:

<template>

  <div class="common-layout">
    <el-container>
      <el-aside width="200px" class="el-aside">Aside</el-aside>
      <el-container>
        <el-header class="el-header">Header</el-header>
        <el-main class="el-main">Main</el-main>
      </el-container>
    </el-container>
    </div>

</template>

<script setup>

</script>

<style scoped lang="less">
.common-layout {
  height: 100%;
  background-color: aquamarine;
}
.el-header {
  background-color: #ede92f;
}
.el-aside {
  background-color: #88e5cc;
  height: 600px;
}
.el-main {
  background-color: #aec6de;
}
</style>

运行,浏览器显示:

成功!

继续在Main.js中修改成我们需要的样式:

<template>

  <div class="common-layout">
    <el-container class="lay-container">
      <!-- <el-aside width="200px" class="el-aside">Aside</el-aside> 将侧边栏改成我们自定义的组件,通过common-aside引入我们自己写的组件-->
      <common-aside></common-aside>
      <el-container>
        <el-header class="el-header">
            <!-- Header 将Header里的内容也替换成我们自己写的组件common-header-->
            <common-header></common-header>
        </el-header>
        <el-main class="right-main">
            Main
        </el-main>
      </el-container>
    </el-container>
    </div>

</template>

<script setup>

</script>

<style scoped lang="less">
.common-layout,.lay-container {
  height: 100%;
}
.el-header {
  background-color: #333;
}
</style>

运行,在浏览器查看源代码:

可以看出我们写的代码已经生效。

4.编写我们自己的左菜单栏

我们预期要实现的左菜单栏如下:

 Menu 菜单 | Element Plus中给出了类似的示例:

编写自定义左菜单栏common-aside对应的组件--新建src\components\CommonAside.vue,将上图中的代码(上面的代码中包含两个菜单栏,我们从第二个el-menu开始)复制过来。

<template>
    <!-- 首先最外层是Main.vue中注释的<el-aside width="200px" class="el-aside">Aside</el-aside>,我们将侧边栏改成我们自定义的组件,通过common-aside引入我们自己写的组件 -->
    <el-aside width="200px" class="el-aside">
        <el-menu
        active-text-color="#ffd04b"
        background-color="#545c64"
        class="el-menu-vertical-demo"
        default-active="2"
        text-color="#fff"
        @open="handleOpen"
        @close="handleClose"
        >
        <el-sub-menu index="1">
          <template #title>
            <el-icon><location /></el-icon>
            <span>Navigator One</span>
          </template>
          <el-menu-item-group title="Group One">
            <el-menu-item index="1-1">item one</el-menu-item>
            <el-menu-item index="1-2">item two</el-menu-item>
          </el-menu-item-group>
          <el-menu-item-group title="Group Two">
            <el-menu-item index="1-3">item three</el-menu-item>
          </el-menu-item-group>
          <el-sub-menu index="1-4">
            <template #title>item four</template>
            <el-menu-item index="1-4-1">item one</el-menu-item>
          </el-sub-menu>
        </el-sub-menu>
        <el-menu-item index="2">
          <el-icon><icon-menu /></el-icon>
          <span>Navigator Two</span>
        </el-menu-item>
        <el-menu-item index="3" disabled>
          <el-icon><document /></el-icon>
          <span>Navigator Three</span>
        </el-menu-item>
        <el-menu-item index="4">
          <el-icon><setting /></el-icon>
          <span>Navigator Four</span>
        </el-menu-item>
      </el-menu>
    </el-aside>
</template>

<script setup>

</script>


<style lang="less" scoped>
.icons{
    width:18px;
    height:18px;
    margin-right:5px;
}
.el-menu{
    border-right:none;
    h3{
        line-height:48px;
        color:#fff;
        text-align:center;
    }
}
.el-aside{
    height:100%;
    background-color:#545c64;
}
</style>

然后在Main.vue中引入我们写的CommonAside.vue组件:

<script setup>
import CommonAside from '@/components/CommonAside.vue'
</script>

运行,浏览器显示:

成功!

从示例代码中可以看出:

el-menu-item表示没有子菜单栏。

        <el-menu-item index="2">
          <el-icon><icon-menu /></el-icon> 
          <span>Navigator Two</span>
        </el-menu-item>

el-sub-menu表示有子菜单栏,子菜单栏写在父菜单栏里面。

          <el-sub-menu index="1-4">
            <template #title>item four</template>
            <el-menu-item index="1-4-1">item one</el-menu-item>
          </el-sub-menu>

通过 el-menu-item-group 组件可以实现菜单进行分组,分组名可以通过 title 属性直接设定,也可以通过具名 slot 来设定。

        <el-menu-item-group title="Group One">
          <el-menu-item index="1-1">item one</el-menu-item>
          <el-menu-item index="1-2">item two</el-menu-item>
        </el-menu-item-group>

修改以上代码,编写我们自己的菜单栏:

将我们的菜单写成一个列表,然后菜单栏根据列表项有无子孩子来遍历生成最终的菜单栏,在CommonAside.vue中的script写入:

<script setup>
import {ref,computed} from 'vue'
const list =ref([
      	{
          path: '/home',
          name: 'home',
          label: '首页',
          icon: 'house',
          url: 'Home'
      	},
        {
            path: '/mall',
            name: 'mall',
            label: '商品管理',
            icon: 'video-play',
            url: 'Mall'
        },
        {
            path: '/user',
            name: 'user',
            label: '用户管理',
            icon: 'user',
            url: 'User'
        },
        {
            path: 'other',
            label: '其他',
            icon: 'location',
            children: [
                {
                    path: '/page1',
                    name: 'page1',
                    label: '页面1',
                    icon: 'setting',
                    url: 'Page1'
                },
                {
                    path: '/page2',
                    name: 'page2',
                    label: '页面2',
                    icon: 'setting',
                    url: 'Page2'
                }
            ]
        }
])
const noChildren = computed(() => list.value.filter(item => !item.children))
const hasChildren =computed(() => list.value.filter(item => item.children))
</script>

然后修改CommonAside.vue中的template:

第一步,写好大体框架,先是没有子菜单的,然后是有子菜单的:

<template>
    <!-- 首先最外层是Main.vue中注释的<el-aside width="200px" class="el-aside">Aside</el-aside>,我们将侧边栏改成我们自定义的组件,通过common-aside引入我们自己写的组件 -->
    <el-aside width="200px" class="el-aside">
        <el-menu active-text-color="#ffd04b" background-color="#545c64" class="el-menu-vertical-demo" default-active="2"
            text-color="#fff" @open="handleOpen" @close="handleClose">
            <!-- 没有子菜单的 -->
            <el-menu-item index="2">
                <el-icon><icon-menu /></el-icon>
                <span>Navigator Two</span>
            </el-menu-item>
            <!-- 有子菜单的 -->
            <el-sub-menu index="1-4">
                <template #title>item four</template>
                <el-menu-item index="1-4-1">item one</el-menu-item>
            </el-sub-menu>

        </el-menu>
    </el-aside>
</template>

继续修改,使用v-for遍历,实现菜单栏的显示效果:

<template>
    <!-- 首先最外层是Main.vue中注释的<el-aside width="200px" class="el-aside">Aside</el-aside>,我们将侧边栏改成我们自定义的组件,通过common-aside引入我们自己写的组件 -->
    <el-aside width="200px" class="el-aside">
        <el-menu>
            <!-- 写菜单栏的大标题————通用后台管理系统 -->
            <h3>通用后台管理系统</h3>
            <!-- 循环遍历菜单栏 -->
            <!-- 1.没有子菜单的遍历 -->
            <el-menu-item v-for="item in noChildren" :key="item.path" :index="item.path">
                <!-- <el-icon><icon-menu /></el-icon> -->
                <!-- 动态获取icon图标 -->
                <component :is="item.icon" class="icons"></component>
                <!-- 显示文字内容 -->
                <span>{{ item.label }}</span>
            </el-menu-item>
            <!-- 2.有子菜单的遍历 -->
            <el-sub-menu v-for="item in hasChildren" :key="item.path" :index="item.path">
                <template #title>
                    <!-- 动态获取icon图标 -->
                    <component :is="item.icon" class="icons"></component>
                    <!-- 显示文字内容 -->
                    <span>{{ item.label }}</span>
                </template>
                <!-- 分组 -->
                <el-menu-item-group>
                <!-- 循环遍历子菜单 -->
                <el-menu-item v-for="child in item.children" :key="child.path" :index="child.path">
                    <!-- 动态获取icon图标 -->
                    <component :is="child.icon" class="icons"></component>
                    <!-- 显示文字内容 -->
                    <span>{{ child.label }}</span>
                    >
                </el-menu-item>
                </el-menu-item-group>
            </el-sub-menu>
        </el-menu>
    </el-aside>
</template>

显示效果:

完成!

;