【Element-UI】Mockjs及案例首页导航、左侧菜单

本文涉及的产品
可观测链路 OpenTelemetry 版,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Mock.js是一个用于生成模拟数据的JavaScript库。它能够模拟后端API接口,用于前端开发时进行接口调试和测试提高自动化测试效率。使用Mock.js可以快速创建虚拟的数据,并且可以设置数据的类型、格式和规则,从而模拟真实的数据响应。Mock.js支持生成随机数据拦截Ajax请求以返回模拟数据支持RESTful API风格等功能,能够提高前端开发效率,并且减少对后端接口的依赖。支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜色等。


一、引言

在看这篇文章之前请先查看【Vue+Element-UI】实现登陆注册界面及axios之get、post请求登录功能实现、跨域问题的解决_无法自律的人的博客这篇文章,这篇文章一些配置根据这一篇进行一个增加;如果你有一定的基础,可不用看。

二、Mock.js

1、什么是Mock.js

       Mock.js是一个用于生成模拟数据的JavaScript库。它能够模拟后端API接口,用于前端开发时进行接口调试和测试提高自动化测试效率。使用Mock.js可以快速创建虚拟的数据,并且可以设置数据的类型、格式和规则,从而模拟真实的数据响应。Mock.js支持生成随机数据拦截Ajax请求以返回模拟数据支持RESTful API风格等功能,能够提高前端开发效率,并且减少对后端接口的依赖

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

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

 

更多内容请查看Mock.js 官网

2、安装配置

2.1、安装

在你的项目的路径CMD窗口下载Mock.js。

npm i mockjs -D
image.gif

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

image.gif编辑

在我们的package.json里面可以看到我们下载的mock.js

image.gif编辑

2.2、引入

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

dev.env.js

'use strict'constmerge=require('webpack-merge')
constprodEnv=require('./prod.env')
module.exports=merge(prodEnv, {
NODE_ENV: '"development"',
MOCK: 'true'})

image.gif

prod.env.js

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

image.gif

最后我们在main.js里面导入

image.gif编辑

// The Vue build version to load with the `import` command// (runtime-only or standalone) has been set in webpack.base.conf with an alias.importVuefrom'vue'//开发环境下才会引入mockjsprocess.env.MOCK&&require('@/mock')
// 新添加1importElementUIfrom'element-ui'// 新添加2,避免后期打包样式不同,要放在import App from './App';之前import'element-ui/lib/theme-chalk/index.css'importAppfrom'./App'importrouterfrom'./router'// 新添加3----实例进行一个挂载Vue.use(ElementUI)
Vue.config.productionTip=falseimportaxiosfrom'@/api/http'importVueAxiosfrom'vue-axios'Vue.use(VueAxios, axios)
/* eslint-disable no-new */newVue({
el: '#app',
router,
components: {App},
template: '<App/>'})

image.gif

3、Mock.js的使用

3.1、定义测试数据文件

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

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

image.gif编辑

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

3.2、mock拦截ajax请求

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

image.gif编辑

importMockfrom'mockjs'//引入mockjs,npm已安装importactionfrom'@/api/action'//引入请求地址//全局设置:设置所有ajax请求的超时时间,模拟网络传输耗时Mock.setup({
// timeout: 400  //延时400s请求到数据timeout: 200-400//延时200-400s请求到数据})
//引登陆的测试数据,并添加至mockjsimportloginInfofrom'@/mock/json/login-mock.js'lets1=action.getFullPath('SYSTEM_USER_DOLOGIN')
Mock.mock(s1, "post", loginInfo)
// Mock.mock(s1, /post|get/i, loginInfo)
image.gif

3.3、模拟测试

使用登录页面模拟测试

<template><divclass="Login"><el-formclass="login-container"><h1class="title">用户登录</h1><el-form-itemlabel=""><el-inputtype="text"v-model="username"placeholder="登录账号"autocomplete="off"></el-input></el-form-item><el-form-itemlabel=""><el-inputtype="password"v-model="password"placeholder="登录密码"autocomplete="off"></el-input></el-form-item><el-form-item><el-buttontype="primary"style="width:100%;"@click="doSubmit()">提交</el-button></el-form-item><el-rowstyle="text-align: center;margin-top:-10px"><el-linktype="primary">忘记密码</el-link><el-linktype="primary"@click="gotoRegister()">用户注册</el-link></el-row></el-form></div></template><script>exportdefault {
name: "Login",
data() {
return {
username: "",
password: ""    }
  },
methods: {
gotoRegister() {
this.$router.push("/Register");
    },
//提交事件doSubmit() {
//设置登录访问地址leturl=this.axios.urls.SYSTEM_USER_DOLOGIN;
// 使用json格式进行传值letparams= {
username: this.username,
password: this.password      }
this.axios.post(url, params).then(r=> {
console.log(r);
this.$message({
message: r.data.message,
type: r.data.code==0?'success': 'error'        });
      }).catch(e=> {
      });
    }
  }
}
</script><stylescoped>.login-wrap {
box-sizing: border-box;
width: 100%;
height: 100%;
padding-top: 10%;
background-image: url(https://pic4.zhimg.com/v2-c5880f5a6d44766feb085c3ae94899c7_r.jpg);
//background-image: url();
background-repeat: no-repeat;
background-position: centerright;
background-size: 100%;
}
.login-container {
border-radius: 10px;
margin: 0pxauto;
width: 350px;
padding: 30px35px15px35px;
background: #fff;
border: 1pxsolid#eaeaea;
text-align: left;
box-shadow: 0020px2pxrgba(0, 0, 0, 0.1);
}
.title {
margin: 0pxauto40pxauto;
text-align: center;
color: #505458;
}
</style>

image.gif

image.gif编辑

三、首页导航、左侧菜单

最终效果

image.gif编辑

1、页面搭建

在我们的components的公共文件夹里面写我们的公共页面

image.gif编辑

    • AppMain.vue:布局容器组件
    • LeftAside.vue:左侧菜单组件
    • TopNav.vue:首页导航组件

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

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

      1.1、图标定义

      图标可以根据自己的风格来,自己也可以进行更改。

      image.gif

      1.2、AppMain.vue

      <template><el-containerclass="main-container"><el-asidev-bind:class="asideClass"><LeftNav></LeftNav></el-aside><el-container><el-headerclass="main-header"><TopNav></TopNav></el-header><el-mainclass="main-center">这是一个非常帅的主页</el-main></el-container></el-container></template><script>// 导入组件importTopNavfrom'@/components/TopNav.vue'importLeftNavfrom'@/components/LeftNav.vue'// 导出模块exportdefault {
      };
      </script><stylescoped>.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: 2pxsolid#333;
      }
      </style>

      image.gif

      1.3、LeftNav.vue

      <template><el-menudefault-active="2"class="el-menu-vertical-demo"background-color="#334157"text-color="#fff"active-text-color="#ffd04b":collapse="collapsed"><divclass="logobox"><imgclass="logoimg"src="../assets/img/logo.png"alt=""></div><el-submenuindex="1"><templateslot="title"><iclass="el-icon-location"></i><span>导航一</span></template><el-menu-item-group><templateslot="title">分组一</template><el-menu-itemindex="1-1">选项1</el-menu-item><el-menu-itemindex="1-2">选项2</el-menu-item></el-menu-item-group><el-menu-item-grouptitle="分组2"><el-menu-itemindex="1-3">选项3</el-menu-item></el-menu-item-group><el-submenuindex="1-4"><templateslot="title">选项4</template><el-menu-itemindex="1-4-1">选项1</el-menu-item></el-submenu></el-submenu><el-menu-itemindex="2"><iclass="el-icon-menu"></i><spanslot="title">导航二</span></el-menu-item><el-menu-itemindex="3"disabled><iclass="el-icon-document"></i><spanslot="title">导航三</span></el-menu-item><el-menu-itemindex="4"><iclass="el-icon-setting"></i><spanslot="title">导航四</span></el-menu-item></el-menu></template><script>exportdefault {
      }
      </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: 20px0px;
      }
      .logoimg {
      height: 40px;
      }
      </style>

      image.gif

      1.4、TopNav.vue

      <template><el-menuclass="el-menu-demo"mode="horizontal"background-color="#334157"text-color="#fff"active-text-color="#fff"><el-buttonclass="buttonimg"><imgclass="showimg":src="collapsed?imgshow:imgsq"@click="doToggle()"></el-button><el-submenuindex="2"class="submenu"><templateslot="title">超级管理员</template><el-menu-itemindex="2-1">设置</el-menu-item><el-menu-itemindex="2-2">个人中心</el-menu-item><el-menu-item@click="exit()"index="2-3">退出</el-menu-item></el-submenu></el-menu></template><script>exportdefault {
      data() {
      return {
      collapsed: false,
      imgshow: require('@/assets/img/show.png'),
      imgsq: require('@/assets/img/sq.png')
          }
        }, methods: {
        }
      }
      </script><stylescoped>.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>

      image.gif

      1.5、index.js

      在index,js里面进行路由配置

      image.gif编辑

      importVuefrom'vue'importRouterfrom'vue-router'importHelloWorldfrom'@/components/HelloWorld'importLoginfrom'@/views/Login'importRegisterfrom'@/views/Register'importAppMainfrom'@/components/AppMain'importLeftNavfrom'@/components/LeftNav'importTopNavfrom'@/components/TopNav'Vue.use(Router)
      exportdefaultnewRouter({
      routes: [
          {
      path: '/Login',
      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        }]
          }
        ]
      })

      image.gif

      2、功能实现

      2.1、AppMain.vue

      // 导出模块exportdefault {
      //把顶部导航和左边导航进行绑定在maincomponents: {
      TopNav, LeftNav  },
      data() {
      return {
      asideClass: 'main-aside'    }
        },
      created() {
      this.$root.Bus.$on('sjm', v=> {
      this.asideClass=v?'main-aside-collapsed' : 'main-aside';
          });
        }
      };

      image.gif

      2.2、LeftNav.vue

      export default {
        data() {
          return {
            collapsed: false
          }
        },
        created() {
          this.$root.Bus.$on('sjm', v => {
            this.collapsed = v;
          });
        }
      }

      image.gif

      2.3、TopNav.vue

      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('sjm', this.collapsed)
          },
          exit() {
            this.$router.push('/Login');
          }
        }
      }

      image.gif

      2.4、main.js

      data() {
      return {
      Bus: newVue()
          }
        }

      image.gif

      3、完整代码

      3.1、AppMain.vue

      <template><el-containerclass="main-container"><el-asidev-bind:class="asideClass"><LeftNav></LeftNav></el-aside><el-container><el-headerclass="main-header"><TopNav></TopNav></el-header><el-mainclass="main-center">这是一个非常帅的主页</el-main></el-container></el-container></template><script>// 导入组件importTopNavfrom'@/components/TopNav.vue'importLeftNavfrom'@/components/LeftNav.vue'// 导出模块exportdefault {
      //把顶部导航和左边导航进行绑定在maincomponents: {
      TopNav, LeftNav  },
      data() {
      return {
      asideClass: 'main-aside'    }
        },
      created() {
      this.$root.Bus.$on('sjm', v=> {
      this.asideClass=v?'main-aside-collapsed' : 'main-aside';
          });
        }
      };
      </script><stylescoped>.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: 2pxsolid#333;
      }
      </style>

      image.gif

      3.2、LeftNav.vue

      <template><el-menudefault-active="2"class="el-menu-vertical-demo"background-color="#334157"text-color="#fff"active-text-color="#ffd04b":collapse="collapsed"><divclass="logobox"><imgclass="logoimg"src="../assets/img/logo.png"alt=""></div><el-submenuindex="1"><templateslot="title"><iclass="el-icon-location"></i><span>导航一</span></template><el-menu-item-group><templateslot="title">分组一</template><el-menu-itemindex="1-1">选项1</el-menu-item><el-menu-itemindex="1-2">选项2</el-menu-item></el-menu-item-group><el-menu-item-grouptitle="分组2"><el-menu-itemindex="1-3">选项3</el-menu-item></el-menu-item-group><el-submenuindex="1-4"><templateslot="title">选项4</template><el-menu-itemindex="1-4-1">选项1</el-menu-item></el-submenu></el-submenu><el-menu-itemindex="2"><iclass="el-icon-menu"></i><spanslot="title">导航二</span></el-menu-item><el-menu-itemindex="3"disabled><iclass="el-icon-document"></i><spanslot="title">导航三</span></el-menu-item><el-menu-itemindex="4"><iclass="el-icon-setting"></i><spanslot="title">导航四</span></el-menu-item></el-menu></template><script>exportdefault {
      data() {
      return {
      collapsed: false    }
        },
      created() {
      this.$root.Bus.$on('sjm', 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: 20px0px;
      }
      .logoimg {
      height: 40px;
      }
      </style>

      image.gif

      3.3、TopNav.vue

      <template><el-menuclass="el-menu-demo"mode="horizontal"background-color="#334157"text-color="#fff"active-text-color="#fff"><el-buttonclass="buttonimg"><imgclass="showimg":src="collapsed?imgshow:imgsq"@click="doToggle()"></el-button><el-submenuindex="2"class="submenu"><templateslot="title">超级管理员</template><el-menu-itemindex="2-1">设置</el-menu-item><el-menu-itemindex="2-2">个人中心</el-menu-item><el-menu-item@click="exit()"index="2-3">退出</el-menu-item></el-submenu></el-menu></template><script>exportdefault {
      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('sjm', this.collapsed)
          },
      exit() {
      this.$router.push('/Login');
          }
        }
      }
      </script><stylescoped>.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>

      image.gif

      3.4、main.js

      // The Vue build version to load with the `import` command// (runtime-only or standalone) has been set in webpack.base.conf with an alias.importVuefrom'vue'//开发环境下才会引入mockjsprocess.env.MOCK&&require('@/mock')
      // 新添加1importElementUIfrom'element-ui'// 新添加2,避免后期打包样式不同,要放在import App from './App';之前import'element-ui/lib/theme-chalk/index.css'importAppfrom'./App'importrouterfrom'./router'// 新添加3----实例进行一个挂载Vue.use(ElementUI)
      Vue.config.productionTip=falseimportaxiosfrom'@/api/http'importVueAxiosfrom'vue-axios'Vue.use(VueAxios, axios)
      /* eslint-disable no-new */newVue({
      el: '#app',
      router,
      //定义变量data() {
      return {
      Bus: newVue()
          }
        },
      components: {App},
      template: '<App/>'})

      image.gif

      我的分享就到这里,欢迎大家在评论区讨论!!!


      相关文章
      |
      12月前
      |
      JSON 前端开发 Java
      Mock.js之Element-ui搭建首页导航与左侧菜单
      Mock.js之Element-ui搭建首页导航与左侧菜单
      77 0
      |
      3月前
      |
      搜索推荐 数据库
      最新UI六零导航系统源码 | 多模版全开源
      使用PHP+MySql,增加后台管理 多模板选择,支持在后台切换模板 增加常用搜索引擎,如:知乎、哔哩哔哩、在线翻译等(支持自定义) 支持用户提交收录申请,地址:http://域名/apply 部分模板优化和增加部分功能,如返回顶部、获取输入框焦点、时间日期显示等
      65 1
      |
      5月前
      |
      前端开发 JavaScript Java
      SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改
      SSMP整合案例第六步 在前端页面上利用axios和element-ui与后端交互实现增删改
      40 1
      |
      12月前
      |
      JavaScript
      element-ui表格数据样式及格式化案例
      element-ui表格数据样式及格式化案例
      346 0
      |
      JSON 前端开发 JavaScript
      Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用
      Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用
      100 0
      |
      6月前
      |
      JSON 前端开发 JavaScript
      【Element-UI】Mock.js,案例首页导航、左侧菜单
      【Element-UI】Mock.js,案例首页导航、左侧菜单
      82 0
      |
      人工智能 自然语言处理 语音技术
      关于element ui中引入官方的NavMenu时出现点击某个子菜单时,所有的子菜单全都展开问题
      关于element ui中引入官方的NavMenu时出现点击某个子菜单时,所有的子菜单全都展开问题
      219 0
      |
      小程序 开发者 iOS开发
      【 uniapp - 黑马优购 | 商品详情 】详情页UI结构设计、商品导航区域实现
      【 uniapp - 黑马优购 | 商品详情 】详情页UI结构设计、商品导航区域实现
      334 0
      |
      6月前
      |
      前端开发 搜索推荐 开发者
      SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
      SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
      |
      6月前
      |
      JavaScript 前端开发 开发者
      SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
      SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍