• SPA项目实现首页导航以及左侧菜单


    前言

    上一篇文章简单的分享了SPA项目实现登录注册以及在开发过程中遇到的一些问题。本篇文章将要分享的内容为SPA项目实现首页导航以及左侧菜单。


    一、准备工作

           1、 安装mockjs的依赖

    npm install mock -D 只在开发环境使用

             2、配置开发环境及生产环境

            dev.env

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

            prod.env

    1. module.exports = {
    2. NODE_ENV: '"production"',
    3. MOCK: 'false'
    4.       }

            在main.js引入mock

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

            3、mock的使用

    前后端分离的开发中,我们通常使用mock进行数据的模拟,我们总不能等后端人员搞完再做吧。所以我们可以使用模拟数据,其中数据的内容需要根据需求前端人员与后端人员商定好。 

    在src目录下创建mock目录,定义mock主文件index.js,并在该文件中定义拦截路由配置

             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)

             login-mock.js

     

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

    二、界面搭建

            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. data(){
    21. return {
    22. asideClass:'main-aside'
    23. }
    24. },
    25. components:{
    26. TopNav,
    27. LeftNav
    28. },
    29. created(){
    30. this.$root.Bus.$on('collapsed-aside',(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