vue-element-admin 综合开发二:搭建首页架子、侧边栏、修改默认样式、menu和路由跳转页面初体验

简介: 这篇文章详细介绍了如何使用Vue和Element UI搭建一个后台管理系统,包括首页布局、侧边栏、样式调整、菜单和路由配置,以及解决开发中遇到的问题。

导言-大纲

一、首页架子的搭建

  1. element 中 整体页面的架构:container的容器

1. Home.vue

  1. 选择倒数第二个,复制到项目的 Home页面,需要编写less样式,所以要安装less 和 less-loader 这两个包:
    npm i less 和 npm i less-loader@5.0.0
  2. Home.vue 添加了<el-container style="height: 100%">

    <template>
      <el-container style="height: 100%">
        <el-aside width="auto">
          <commen-aside-menu></commen-aside-menu>
        </el-aside>
        <el-container>
          <el-header>Header</el-header>
          <el-main>Main</el-main>
        </el-container>
      </el-container>
    </template>
    
    <script>
    export default {
      name: 'Home',
      data(){
        return {}
      }
    }
    </script>
    <style lang="less" scoped>
    .el-header {
        background-color: #333;
    }
    .el-main {
        padding-top: 0;
    }
    </style>
    

2. main.js 中进行按需引入

import Vue from 'vue'
import {Button, Container, Header, Main, Aside} from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'

import router from './router'

Vue.config.productionTip = false

//Vue.component(Button)
Vue.use(Button)
Vue.use(Container)
Vue.use(Header)
Vue.use(Main)
Vue.use(Aside)

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

3. 修改App.vue

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
//import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App'
}
</script>

4. 页面

在这里插入图片描述

二、侧边栏的实现

跟着官网走:menu的样式

1. 新建 component/commenAsideMenu.vue

把element中的侧边栏copy过来。

<template>
    <el-menu default-active="1-4-1" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" :collapse="isCollapse">
    <el-submenu index="1">
        <template slot="title">
        <i class="el-icon-location"></i>
        <span slot="title">导航一</span>
        </template>
        <el-menu-item-group>
        <span slot="title">分组一</span>
        <el-menu-item index="1-1">选项1</el-menu-item>
        <el-menu-item index="1-2">选项2</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="分组2">
        <el-menu-item index="1-3">选项3</el-menu-item>
        </el-menu-item-group>
        <el-submenu index="1-4">
        <span slot="title">选项4</span>
        <el-menu-item index="1-4-1">选项1</el-menu-item>
        </el-submenu>
    </el-submenu>
    <el-menu-item index="2">
        <i class="el-icon-menu"></i>
        <span slot="title">导航二</span>
    </el-menu-item>
    <el-menu-item index="3" disabled>
        <i class="el-icon-document"></i>
        <span slot="title">导航三</span>
    </el-menu-item>
    <el-menu-item index="4">
        <i class="el-icon-setting"></i>
        <span slot="title">导航四</span>
    </el-menu-item>
    </el-menu>
</template>

<style>
  .el-menu-vertical-demo:not(.el-menu--collapse) {
    width: 200px;
    min-height: 400px;
  }
</style>

<script>
  export default {
    data() {
      return {
        isCollapse: true
      };
    },
    methods: {
      handleOpen(key, keyPath) {
        console.log(key, keyPath);
      },
      handleClose(key, keyPath) {
        console.log(key, keyPath);
      }
    }
  }
</script>

2. Home.vue

在这里插入图片描述

3. main.js

在这里插入图片描述

4. 页面

在这里插入图片描述

三、解决默认样式

1. 解决最上面空白的区域

原因:app.vue中有默认样式

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

删掉,改成:

<style>
#app {
  height: 100vh;
}
</style>

结果:
在这里插入图片描述

2. 展开侧边栏

修改为false
在这里插入图片描述
结果:
在这里插入图片描述

3. 改造侧边栏

a. 无孩子菜单

  1. 把数据放到data中,这应该是从数据中获取的

    [
            {
              path: '/',
              name: 'home',
              label: '首页',
              icon: 's-home',
              url: 'Home/Home'
            },
            {
              path: '/mall',
              name: 'mall',
              label: '商品管理',
              icon: 'video-play',
              url: 'MallManage/MallManage'
            },
            {
              path: '/user',
              name: 'user',
              label: '用户管理',
              icon: 'user',
              url: 'UserManage/UserManage'
            },
            {
              label: '其他',
              icon: 'location',
              children: [
                {
                  path: '/page1',
                  name: 'page1',
                  label: '页面1',
                  icon: 'setting',
                  url: 'Other/PageOne'
                },
                {
                  path: '/page2',
                  name: 'page2',
                  label: '页面2',
                  icon: 'setting',
                  url: 'Other/PageTwo'
                }
              ]
            }
          ]
    
  2. 编写计算函数,将数据分为 带有孩子的和不带孩子的

      computed: {
        noChildren() {
          return this.menu.filter(item => !item.children)
        },
        hasChildren(){
          return this.menu.filter(item => item.children)
        }
    
  3. 改造侧边栏代码,进行for 循环便利。

    <template>
      <el-menu
        default-active="1-4-1"
        class="el-menu-vertical-demo"
        @open="handleOpen"
        @close="handleClose"
        :collapse="isCollapse"
      >
        <el-menu-item v-for="item in noChildren" :index="item.path" :key="item.path">
          <i :class="'el-icon-' + item.icon"></i>
          <span slot="title">{
        {item.label}}</span>
        </el-menu-item>
        <el-submenu index="1">
          <template slot="title">
            <i class="el-icon-location"></i>
            <span slot="title">导航一</span>
          </template>
          <el-menu-item-group>
            <el-menu-item index="1-1">选项1</el-menu-item>
            <el-menu-item index="1-2">选项2</el-menu-item>
          </el-menu-item-group>
        </el-submenu>
      </el-menu>
    </template>
    
  4. 页面展示
    在这里插入图片描述

b、无孩子菜单

直接上代码就行了

<template>
  <el-menu
    default-active="1-4-1"
    class="el-menu-vertical-demo"
    @open="handleOpen"
    @close="handleClose"
    :collapse="isCollapse"
  >
    <h3>通用后台管理系统</h3>
    <el-menu-item v-for="item in noChildren" :index="item.path" :key="item.path">
      <i :class="'el-icon-' + item.icon"></i>
      <span slot="title">{
  {item.label}}</span>
    </el-menu-item>
    <el-submenu v-for="item in hasChildren" :index="item.path" :key="item.path">
      <template slot="title">
        <i :class="'el-icon-' + item.icon"></i>
        <span slot="title">{
  {item.label}}</span>
      </template>
      <el-menu-item-group v-for="(subItem, subIndex) in item.children" :key="subItem.path">
        <el-menu-item :index="subIndex">{
  {subItem.label}}</el-menu-item>
      </el-menu-item-group>
    </el-submenu>
  </el-menu>
</template>

在这里插入图片描述
在这里插入图片描述

四、menu/App.vue样式和路由跳转

1. 修改menu样式

  1. commenAsideMenu.vue 侧边栏样式

    .el-menu {
      height: 100%;
      border: none;
      h3 {
        color: #fff;
        text-align: center;
        line-height: 48px;
      }
    }
    

    在这里插入图片描述

  2. 背景颜色,鼠标移动上后高亮
    在这里插入图片描述
    在这里插入图片描述

2. 修改App.vue 样式

在App.vue中解决左边和上边的白边以及侧边栏的高度问题。
在这里插入图片描述
解决样式

html, body {
  margin: 0px;  
  padding: 0px;
  height: 100%; // 解决高度问题
}

在这里插入图片描述

3. 路由

a、 添加事件

在这里插入图片描述
在这里插入图片描述

b、更改Home为Main.vue

因为这里的Home,已经不是Home的意义了,而是主页的意义,所以改为Main。

  1. 修改名称
  2. 修改路由中的名称
    在这里插入图片描述

c、移动views/user/index.vue

<template>
  <div>
    我是 User 页面
  </div>
</template>

<script>
export default {
  name: 'User',
  data(){
    return {}
  }
}
</script>

d、新建views/home/index.vue

<template>
  <div>
    我是 Home 页面
  </div>
</template>

<script>
export default {
  name: 'Home',
  data(){
    return {}
  }
}
</script>

e、修改router/index.js

const routes = [
    {
        path: '/',
        name: 'Main',
        component: () => import('../views/Main.vue'),   // 第二种方式
        children: [
            {
                path: '/home',
                name: 'home',
                component: () => import('../views/home')
            },
            {
                path: '/user',
                name: 'user',
                component: User
            }
        ]
    }
]

在这里插入图片描述

f、更改Main.vue

在这里插入图片描述

g、页面

在这里插入图片描述
在这里插入图片描述

五、开发中的bug和警告

1. prop “index”. 警告

vue.runtime.esm.js?c320:4560 [Vue warn]: Invalid prop: custom validator check failed for prop "index".

在使用elementUI循环渲染导航的过程中
在这里插入图片描述
会出现如下警告
在这里插入图片描述
报错翻译:无效属性:属性“index”的类型检查失败。应为值为“undefined”的字符串,但未定义
解决方法:
在这里插入图片描述
将:index=“item.path”
改为:index="item.path + ’ ’ "
完美解决

原因:elementUI的index是字符串格式,加一个‘ ’,将后台数据转换为字符串,那个item确实没有path这个属性,所以返回undefined。最好给那个item加个path属性,或者干脆换个属性,比如name,所有item都有这个属性就可以了。

相关文章
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
640 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
【全是精华】Token的获取和使用-FastApi版
【全是精华】Token的获取和使用-FastApi版
1726 0
【Vite】Vite设置好了Proxy,但接口却404!解决方案来了!
前言 最近在做一个Vue3+Vite+TypeScript的项目,进行一番网上冲浪后,参考了众多🐴友的方案,配置完vite.config.ts准备开始与后端的同学开始联调,发现无论怎么样都是404,然后就开始了一步步的排查!
6890 0
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
这篇文章是关于如何使用vue-cli搭建vue环境,并整合Element UI和vue-router来开发一个基础的前端管理后台界面。
795 0
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
|
存储 前端开发 Java
Element el-upload 文件上传/图片上传/拖拽上传/附带参数/附带请求头部详解
文目录 1. 前言 2. 基本用法 2.1 前端部分 2.2 后端部分 2.3 获取后端返回信息 3. 外观功能介绍 3.1 拖拽上传 3.2 显示图片 3.3 设置文件列表样式 3.4 显示提示信息 4. 事件功能介绍 4.1 限制上传文件数量 4.2 限制上传文件类型和大小 4.3 移除文件处理 4.4 手动上传 5. 附带参数 6. 附带请求头部 7. 小结
8654 0
|
缓存 前端开发 NoSQL
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
vue-element-admin实战 | 第二篇: 最小改动接入后台实现根据权限动态加载菜单
|
Java 应用服务中间件
SpringBoot工程打包部署
SpringBoot工程打包部署简介:SpringBoot项目可通过三种方式运行:可执行Jar包、可执行War包和标准War包。其中,可执行Jar/War包可独立运行,标准War包需部署在Tomcat中。具体步骤包括:1. 修改pom.xml添加构建依赖;2. 执行`mvn clean package`命令打包;3. 运行生成的Jar/War包(如`java -jar xxx.jar`)。对于标准War包,还需修改启动类并配置Tomcat依赖。
1749 7
|
资源调度 JavaScript API
vue-element-admin 综合开发五:引入 echarts,封装echarts 组件
这篇文章介绍了如何在vue-element-admin项目中引入并封装ECharts组件,以及如何实现折线图、柱状图和饼图的展示。
1916 4
vue-element-admin 综合开发五:引入 echarts,封装echarts 组件
|
JavaScript
基于Vue3实现简约型侧边栏
本文介绍了如何在Vue3项目中实现一个简约型侧边栏导航,包括配置路由、页面布局和导航交互,以及如何通过Vue Router和条件渲染实现动态内容展示。
2000 1