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:

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

1.3.2 mock拦截ajax请求

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

import Mock from 'mockjs' //引入mockjs,npm已安装
import action from '@/api/action' //引入请求地址//全局设置:设置所有ajax请求的超时时间,模拟网络传输耗时
Mock.setup({// timeout: 400  //延时400s请求到数据timeout: 200 - 400 //延时200-400s请求到数据
})//引登陆的测试数据,并添加至mockjs
import loginInfo from '@/mock/json/login-mock.js'
let s1 = action.getFullPath('SYSTEM_USER_DOLOGIN')
Mock.mock(s1, "post", loginInfo)
// 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组件

<template><el-container class="main-container"><el-aside v-bind:class="asideClass"><LeftNav></LeftNav></el-aside><el-container><el-header class="main-header"><TopNav></TopNav></el-header><el-main class="main-center">Main</el-main></el-container></el-container>
</template><script>// 导入组件import TopNav from '@/components/TopNav.vue'import LeftNav from '@/components/LeftNav.vue'// 导出模块export default {components: {TopNav,LeftNav},data() {return {asideClass: 'main-aside'}},created() {this.$root.Bus.$on('aaa', v => {this.asideClass = v ? 'main-aside-collapsed':'main-aside'})}};
</script>
<style scoped>.main-container {height: 100%;width: 100%;box-sizing: border-box;}.main-aside-collapsed {/* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */width: 64px !important;height: 100%;background-color: #334157;margin: 0px;}.main-aside {width: 240px !important;height: 100%;background-color: #334157;margin: 0px;}.main-header,.main-center {padding: 0px;border-left: 2px solid #333;}
</style>

左侧菜单LeftNav.vue组件

<template><el-menu default-active="2" class="el-menu-vertical-demo" background-color="#334157"text-color="#fff" active-text-color="#ffd04b" :collapse="collapsed"><!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> --><div class="logobox"><img class="logoimg" src="../assets/img/logo.png" alt=""></div><el-submenu index="1"><template slot="title"><i class="el-icon-location"></i><span>导航一</span></template><el-menu-item-group><template slot="title">分组一</template><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"><template slot="title">选项4</template><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>
<script>export default {data(){return{collapsed:false}},created() {this.$root.Bus.$on('aaa',v=>{this.collapsed=v})}}
</script>
<style>.el-menu-vertical-demo:not(.el-menu--collapse) {width: 240px;min-height: 400px;}.el-menu-vertical-demo:not(.el-menu--collapse) {border: none;text-align: left;}.el-menu-item-group__title {padding: 0px;}.el-menu-bg {background-color: #1f2d3d !important;}.el-menu {border: none;}.logobox {height: 40px;line-height: 40px;color: #9d9d9d;font-size: 20px;text-align: center;padding: 20px 0px;}.logoimg {height: 40px;}
</style>

顶部导航TopNav.vue组件

<template><!-- <el-menu :default-active="activeIndex2" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#545c64"text-color="#fff" active-text-color="#ffd04b"><el-menu-item index="1">处理中心</el-menu-item><el-submenu index="2"><template slot="title">我的工作台</template><el-menu-item index="2-1">选项1</el-menu-item><el-menu-item index="2-2">选项2</el-menu-item><el-menu-item index="2-3">选项3</el-menu-item><el-submenu index="2-4"><template slot="title">选项4</template><el-menu-item index="2-4-1">选项1</el-menu-item><el-menu-item index="2-4-2">选项2</el-menu-item><el-menu-item index="2-4-3">选项3</el-menu-item></el-submenu></el-submenu><el-menu-item index="3" disabled>消息中心</el-menu-item><el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item></el-menu> --><el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff"><el-button class="buttonimg"><img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()"></el-button><el-submenu index="2" class="submenu"><template slot="title">超级管理员</template><el-menu-item index="2-1">设置</el-menu-item><el-menu-item index="2-2">个人中心</el-menu-item><el-menu-item @click="exit()" index="2-3">退出</el-menu-item></el-submenu></el-menu>
</template><script>export default {data(){return{collapsed:false,imgshow:require('@/assets/img/show.png'),imgsq:require('@/assets/img/sq.png')}},methods:{doToggle(){this.collapsed = !this.collapsed;// 将是否折叠变量放入总线this.$root.Bus.$emit('aaa',this.collapsed);},exit(){this.$router.push('/');}}}
</script><style scoped>.el-menu-vertical-demo:not(.el-menu--collapse) {border: none;}.submenu {float: right;}.buttonimg {height: 60px;background-color: transparent;border: none;}.showimg {width: 26px;height: 26px;position: absolute;top: 17px;left: 17px;}.showimg:active {border: none;}
</style>

 2.3 配置路由index.js

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import AppMain from '@/components/AppMain'
import LeftNav from '@/components/LeftNav'
import TopNav from '@/components/TopNav'
import Login from '@/views/Login'
import Register from '@/views/Register'Vue.use(Router)export default new Router({routes: [{path: '/',name: 'Login',component: Login},{path: '/Register',name: 'Register',component: Register},{path: '/AppMain',name: 'AppMain',component: AppMain,children:[{path: '/LeftNav',name: 'LeftNav',component: LeftNav},{path: '/TopNav',name: 'TopNav',component: TopNav}]}]
})

2.4 配置总线main.js

new Vue({el: '#app',router,data(){return {Bus:new Vue()}},components: { App },template: '<App/>'
})

展示效果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/88078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT 6.5下载安装及配置教程

一、下载 今天打算换一个QT安装版本,去官网看了一眼发现变成了在线安装。 本来官方下载的就慢,现在更是雪上加霜,现在给大家推荐几种下载方式。 1、国内镜像 中国科学技术大学&#xff1a;http://mirrors.ustc.edu.cn/qtproject/ 清华大学&#xff1a;https://mirrors.tuna.ts…

Ubuntu部署nginx

一、 下载nginx相关依赖包 apt-get install gccapt-get install libpcre3 libpcre3-devapt-get install zlib1g zlib1g-devsudo apt-get install opensslsudo apt-get install libssl-dev二、新建nginx的安装目录 cd /optmkdir nginxcd nginx三、通过wget下载nginx安装包 wg…

2024快手校招面试真题汇总及其解答(一)

1.spring springmvc springboot区别 Spring、Spring MVC 和 Spring Boot 都是 Java 框架,它们之间存在一定的联系和区别。 Spring 是 Java 的一个开源框架,它提供了一系列的模块,用于简化 Java 应用程序的开发。Spring 的核心模块是 IoC 容器和 AOP 框架,它们可以帮助开发…

SpringBatch ItemProcessor详解

ItemProcessor 在Spring Batch中用于对每个读取的数据项&#xff08;item&#xff09;进行处理或转换。 一、ItemProcessor 具体功能 数据清洗&#xff08;Data Cleansing&#xff09;&#xff1a;清理数据以确保数据的一致性和准确性。这可以包括去除不必要的空格、特殊字符、…

2025快手校招面试真题汇总及其解答(二)

6. hashmap数据结构 HashMap 是一种散列表,它是一种根据键值对来存储数据的数据结构。HashMap 的特点是插入、查找和删除操作的时间复杂度都是 O(1),因此它是一种非常高效的数据结构。 HashMap 的工作原理是将键值对存储在一个数组中,每个键值对都由一个哈希函数来映射到数…

pyspark 检测任务输出目录是否空,避免读取报错

前言 在跑调度任务时候&#xff0c;有时候子任务需要依赖前置任务的输出&#xff0c;但类似读取 Parquet 或者 Orc 文件时&#xff0c;如果不判断目录是否为空&#xff0c;在输出为空时会报错&#xff0c;所以需要 check 一下&#xff0c;此外Hadoop通常在写入数据时会在目录中…

简易好用的C++结构体与JSON文本相互转换开源库

开源库地址&#xff1a; https://github.com/bk192077/struct_mapping.git 支持结构体&#xff0c;std::strng, std::vcetor, std::list, std::map, std::multimap等类型 注意&#xff1a;需要std c17 及以上版本支持 测试程序&#xff1a; #include "struct_mapping…

电压放大器在超声成像中的工作原理和应用

在超声成像中&#xff0c;电压放大器是一种重要的仪器&#xff0c;主要用于放大从探头传来的微弱信号&#xff0c;并将其转换为可以处理和显示的电信号。下面安泰电子将详细介绍电压放大器在超声成像中的工作原理和应用。 图&#xff1a;超声成像 工作原理 在超声成像中&#x…

第二届全国高校计算机技能竞赛——Java赛道

第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…

18672-2014 枸杞 学习记录

声明 本文是学习GB-T 18672-2014 枸杞. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了枸杞的质量要求、试验方法、检验规则、标志、包装、运输和贮存。 本标准适用于经干燥加工制成的各品种的枸杞成熟果实。 2 规范性引用文件…

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-BiGRU鹈鹕算法优化卷积双向…

PHP生成带中文的图片

imagettftext() 函数是 PHP 中的一个内置函数&#xff0c;用于使用 TrueType 字体将文本写入图像。 句法&#xff1a; 数组imagettftext&#xff08;资源$image&#xff0c;float $size&#xff0c;float $angle&#xff0c; int $x&#xff0c;int $y&#xff0c;…

【Pycharm/Anaconda配置环境记录】

文章目录 1、Pytorch配置2、mmcv配置 1、Pytorch配置 查看虚拟环境创建虚拟环境 conda env list&#xff1a;查看虚拟环境 conda create --name env_name python3.7&#xff1a;创建虚拟环境 conda activate env_name&#xff1a;激活/进入该虚拟环境 查看自己的CUDA版本以及P…

田忌赛马Java

给定两个大小相等的数组 A 和 B&#xff0c;A 相对于 B 的优势可以用满足 Ai] > Bi] 的索的数目来描述。 返回 A的任意排列&#xff0c;使其相对于 B 的优势最大化. 其实核心思想就是让A中的数最小且刚好大于B中数,我们可以用链表来存储A和B中对应的数据,至于B比A中所有的数…

DragGesture/拖动手势 的使用

1. DragGesture 拖动手势操作 1.1 实现 /// 拖动手势 struct DragGestureBootcamp: View {State var offset: CGSize .zerovar body: some View {//dragGesture1dragGesture2}/// 方式二var dragGesture2: some View{ZStack {VStack {Text("\(offset.width)")Space…

【算法练习Day5】有效的字母异位词 两个数组的交集快乐数两数之和

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 有效的字母异位词两个数…

Java中的匿名内部类(看这篇就够了)

匿名内部类是一种没有名称的局部内部类&#xff0c;它通常用于创建只需使用一次的类的实例。以下是有关Java匿名内部类的一些重要信息&#xff1a; 定义匿名内部类&#xff1a; 匿名内部类通常用于创建实现某个接口或继承某个类的子类的对象。它没有类名&#xff0c;直接继承或…

MySQL数据库入门到精通8--进阶篇( MySQL管理)

7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后&#xff0c;自带了一下四个数据库&#xff0c;具体作用如下&#xff1a; 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务&#xff0c;而是指mysql的客户端工具。 语法 &#xff1a; mysql [options] [database] 选…

【Elasticsearch】简单搜索(三)

简介&#xff1a;Elasticsearch&#xff08;ES&#xff09;是一个开源的分布式搜索和分析引擎&#xff0c;用于快速存储、搜索和分析大量数据。它具有高性能、可扩展性和灵活性的特点&#xff0c;被广泛用于构建实时搜索、日志分析、数据可视化等应用。 这篇文章主要介绍检索相…