• ElementUI首页导航和左侧菜单静态页面的实现,以及Mockjs和总线的介绍


    目录

    前言

    一. Mock.js

    1.1 什么是Mock.js

    1.2 Mockjs的安装与配置

    1.2.1 安装Mock.js

    1.2.2 引入Mock.js

     1.3 Mockjs的使用

    1.3.1 定义数据测试文件

    1.3.2 mock拦截ajax请求

     二. 首页导航以及左侧菜单的搭建

    2.1 什么是总线

    2.2 创建三个vue组件

    首页AppMain.vue组件

    左侧菜单LeftNav.vue组件

    顶部导航TopNav.vue组件

     2.3 配置路由index.js

    2.4 配置总线main.js

    展示效果


    前言

    上一篇博客分享了登录界面的实现,这篇继续完成首页导航以及左侧菜单的实现。

    一. Mock.js

    1.1 什么是Mock.js

    Mock.js是一个用于前端开发的模拟数据生成工具。它的作用是模拟后端接口返回的数据,以便在前端开发过程中进行接口调试和页面展示。通过使用Mock.js,开发人员可以在没有真实后端接口的情况下,快速生成模拟数据,模拟各种接口返回的情况,从而提高开发效率。

    Mock.js主要作用于前端开发中的接口调试和数据展示阶段。在前端开发过程中,通常需要与后端进行数据交互,而后端接口可能尚未开发完成或者无法直接访问。这时候可以使用Mock.js来模拟后端接口返回的数据,以便进行前端页面的开发和调试。通过定义模拟数据的规则,Mock.js可以生成符合要求的模拟数据,使得前端开发人员能够独立进行开发工作,而不受后端接口的限制。

    Mock.js因为两个重要的特性风靡前端:

    • 数据类型丰富:支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。

    • 拦截Ajax请求:不需要修改既有代码,就可以拦截Ajax请求,返回模拟的响应数据。

     Mock.js官方地址http://mockjs.com/

    1.2 Mockjs的安装与配置

    1.2.1 安装Mock.js

    npm i mockjs -D

    -D表示只在开发环境中使用  

    安装成功后,就可以在SPA项目中的package.json中查看到。

    1.2.2 引入Mock.js

    为了只在开发环境使用mock,而打包到生产环境时自动不使用mock,我们需要在config目录中的dev.env.jsprod.env.js做一个配置,如下:

    • dev.env.js(开发环境)

    module.exports = merge(prodEnv, {
      NODE_ENV: '"development"',
      MOCK: 'true'
    })

    • prod.env.js(生产环境)

    module.exports = {
      NODE_ENV: '"production"',
      MOCK: 'false'

    • main.js

    //开发环境下才会引入mockjs
    process.env.MOCK && require('@/mock') 

     1.3 Mockjs的使用

    1.3.1 定义数据测试文件

    为每个*.vue定义单独的xxx-mock.js文件,并在其中添加自定义的json数据,还可以通过mockjs的模块生成随机数据信息,动态测试ajax请求效果。

    创建src/mock/json目录,定义登录测试数据文件login-mock.js:

    1. // const loginInfo = {
    2. // code: -1,
    3. // message: '密码错误'
    4. // }
    5. //使用mockjs的模板生成随机数据
    6. const loginInfo = {
    7. 'code|-1-0': 0,
    8. 'message|3-10': 'msg'
    9. }
    10. export default loginInfo;

    1.3.2 mock拦截ajax请求

    在src/mock目录下创建index.js,定义拦截路由配置:

    1. import Mock from 'mockjs' //引入mockjs,npm已安装
    2. import action from '@/api/action' //引入请求地址
    3. //全局设置:设置所有ajax请求的超时时间,模拟网络传输耗时
    4. Mock.setup({
    5. // timeout: 400 //延时400s请求到数据
    6. timeout: 200 - 400 //延时200-400s请求到数据
    7. })
    8. //引登陆的测试数据,并添加至mockjs
    9. import loginInfo from '@/mock/json/login-mock.js'
    10. let s1 = action.getFullPath('SYSTEM_USER_DOLOGIN')
    11. Mock.mock(s1, "post", loginInfo)
    12. // Mock.mock(s1, /post|get/i, loginInfo)

     这里的action请求地址以及 post/get请求在上一篇博客中有源码http://t.csdn.cn/Ycyjv

     配置完成后进行测试,效果如下:

     二. 首页导航以及左侧菜单的搭建

    2.1 什么是总线

    总线(Bus)是一种在组件之间进行通信的机制。在前端开发中,总线通常指的是一种用于组件之间传递消息和数据的中央事件总线或状态管理器。

    总线可以作为一个中心化的通信枢纽,允许不同组件之间进行解耦的通信。通过总线,一个组件可以向总线发布(emit)一个事件或数据,而其他组件可以订阅(subscribe)这个事件或数据,并在事件触发时做出相应的处理。

    总线的使用可以简化组件之间的通信,特别是在组件层级较深或组件之间没有直接父子关系的情况下。通过总线,组件可以在不直接引用或传递数据给其他组件的情况下进行通信,从而提高代码的可维护性和灵活性。

    2.2 创建三个vue组件

    根据vue组件之间传递数据实现element-ui的NavMenu菜单折叠、展开效果。

    • 子组件往父组件传递数据(this.$emit):TopNav -> AppMain

    • 父组件往子组件传递数据(props):AppMain -> LeftNav

    首页AppMain.vue组件

    1. <template>
    2. <el-container class="main-container">
    3. <el-aside v-bind:class="asideClass">
    4. <LeftNav>LeftNav>
    5. el-aside>
    6. <el-container>
    7. <el-header class="main-header">
    8. <TopNav>TopNav>
    9. el-header>
    10. <el-main class="main-center">Mainel-main>
    11. el-container>
    12. el-container>
    13. template>
    14. <script>
    15. // 导入组件
    16. import TopNav from '@/components/TopNav.vue'
    17. import LeftNav from '@/components/LeftNav.vue'
    18. // 导出模块
    19. export default {
    20. components: {
    21. TopNav,
    22. LeftNav
    23. },
    24. data() {
    25. return {
    26. asideClass: 'main-aside'
    27. }
    28. },
    29. created() {
    30. this.$root.Bus.$on('aaa', v => {
    31. this.asideClass = v ? 'main-aside-collapsed':'main-aside'
    32. })
    33. }
    34. };
    35. script>
    36. <style scoped>
    37. .main-container {
    38. height: 100%;
    39. width: 100%;
    40. box-sizing: border-box;
    41. }
    42. .main-aside-collapsed {
    43. /* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
    44. width: 64px !important;
    45. height: 100%;
    46. background-color: #334157;
    47. margin: 0px;
    48. }
    49. .main-aside {
    50. width: 240px !important;
    51. height: 100%;
    52. background-color: #334157;
    53. margin: 0px;
    54. }
    55. .main-header,
    56. .main-center {
    57. padding: 0px;
    58. border-left: 2px solid #333;
    59. }
    60. style>

    左侧菜单LeftNav.vue组件

    1. <template>
    2. <el-menu default-active="2" class="el-menu-vertical-demo" background-color="#334157"
    3. text-color="#fff" active-text-color="#ffd04b" :collapse="collapsed">
    4. <div class="logobox">
    5. <img class="logoimg" src="../assets/img/logo.png" alt="">
    6. div>
    7. <el-submenu index="1">
    8. <template slot="title">
    9. <i class="el-icon-location">i>
    10. <span>导航一span>
    11. template>
    12. <el-menu-item-group>
    13. <template slot="title">分组一template>
    14. <el-menu-item index="1-1">选项1el-menu-item>
    15. <el-menu-item index="1-2">选项2el-menu-item>
    16. el-menu-item-group>
    17. <el-menu-item-group title="分组2">
    18. <el-menu-item index="1-3">选项3el-menu-item>
    19. el-menu-item-group>
    20. <el-submenu index="1-4">
    21. <template slot="title">选项4template>
    22. <el-menu-item index="1-4-1">选项1el-menu-item>
    23. el-submenu>
    24. el-submenu>
    25. <el-menu-item index="2">
    26. <i class="el-icon-menu">i>
    27. <span slot="title">导航二span>
    28. el-menu-item>
    29. <el-menu-item index="3" disabled>
    30. <i class="el-icon-document">i>
    31. <span slot="title">导航三span>
    32. el-menu-item>
    33. <el-menu-item index="4">
    34. <i class="el-icon-setting">i>
    35. <span slot="title">导航四span>
    36. el-menu-item>
    37. el-menu>
    38. template>
    39. <script>
    40. export default {
    41. data(){
    42. return{
    43. collapsed:false
    44. }
    45. },
    46. created() {
    47. this.$root.Bus.$on('aaa',v=>{
    48. this.collapsed=v
    49. })
    50. }
    51. }
    52. script>
    53. <style>
    54. .el-menu-vertical-demo:not(.el-menu--collapse) {
    55. width: 240px;
    56. min-height: 400px;
    57. }
    58. .el-menu-vertical-demo:not(.el-menu--collapse) {
    59. border: none;
    60. text-align: left;
    61. }
    62. .el-menu-item-group__title {
    63. padding: 0px;
    64. }
    65. .el-menu-bg {
    66. background-color: #1f2d3d !important;
    67. }
    68. .el-menu {
    69. border: none;
    70. }
    71. .logobox {
    72. height: 40px;
    73. line-height: 40px;
    74. color: #9d9d9d;
    75. font-size: 20px;
    76. text-align: center;
    77. padding: 20px 0px;
    78. }
    79. .logoimg {
    80. height: 40px;
    81. }
    82. style>

    顶部导航TopNav.vue组件

    1. <template>
    2. <el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
    3. <el-button class="buttonimg">
    4. <img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
    5. el-button>
    6. <el-submenu index="2" class="submenu">
    7. <template slot="title">超级管理员template>
    8. <el-menu-item index="2-1">设置el-menu-item>
    9. <el-menu-item index="2-2">个人中心el-menu-item>
    10. <el-menu-item @click="exit()" index="2-3">退出el-menu-item>
    11. el-submenu>
    12. el-menu>
    13. template>
    14. <script>
    15. export default {
    16. data(){
    17. return{
    18. collapsed:false,
    19. imgshow:require('@/assets/img/show.png'),
    20. imgsq:require('@/assets/img/sq.png')
    21. }
    22. },
    23. methods:{
    24. doToggle(){
    25. this.collapsed = !this.collapsed;
    26. // 将是否折叠变量放入总线
    27. this.$root.Bus.$emit('aaa',this.collapsed);
    28. },
    29. exit(){
    30. this.$router.push('/');
    31. }
    32. }
    33. }
    34. script>
    35. <style scoped>
    36. .el-menu-vertical-demo:not(.el-menu--collapse) {
    37. border: none;
    38. }
    39. .submenu {
    40. float: right;
    41. }
    42. .buttonimg {
    43. height: 60px;
    44. background-color: transparent;
    45. border: none;
    46. }
    47. .showimg {
    48. width: 26px;
    49. height: 26px;
    50. position: absolute;
    51. top: 17px;
    52. left: 17px;
    53. }
    54. .showimg:active {
    55. border: none;
    56. }
    57. style>

     2.3 配置路由index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. import AppMain from '@/components/AppMain'
    5. import LeftNav from '@/components/LeftNav'
    6. import TopNav from '@/components/TopNav'
    7. import Login from '@/views/Login'
    8. import Register from '@/views/Register'
    9. Vue.use(Router)
    10. export default new Router({
    11. routes: [
    12. {
    13. path: '/',
    14. name: 'Login',
    15. component: Login
    16. },{
    17. path: '/Register',
    18. name: 'Register',
    19. component: Register
    20. },{
    21. path: '/AppMain',
    22. name: 'AppMain',
    23. component: AppMain,
    24. children:[
    25. {
    26. path: '/LeftNav',
    27. name: 'LeftNav',
    28. component: LeftNav
    29. },{
    30. path: '/TopNav',
    31. name: 'TopNav',
    32. component: TopNav
    33. }
    34. ]
    35. }
    36. ]
    37. })

    2.4 配置总线main.js

    1. new Vue({
    2. el: '#app',
    3. router,
    4. data(){
    5. return {
    6. Bus:new Vue()
    7. }
    8. },
    9. components: { App },
    10. template: '<App/>'
    11. })

    展示效果

    这里我没有与后台数据进行交互,仅仅只是静态页面的展示

  • 相关阅读:
    [ 常用工具篇 ] 安装 kali 并设置 root 密码
    String常用方法归纳 & StringBuilder拓展——火速收藏!!!
    SATA系列专题之四:4.0 Command Layer命令层概述
    【Docker】了解和使用Docker
    uni-app:实现等待加载功能
    voliate实战:voliate可见性验证&有序性&非原子性验证
    初级 - 若依框架 - Java Spring/Spring Boot 项目理解记录
    从零开始Blazor Server(4)--登录系统
    React16入门到入土
    前端需要的免费在线api接口
  • 原文地址:https://blog.csdn.net/lijie1025/article/details/133268960