• Element-Ui+Vue实现首页布局(带收缩展开效果)


    目录

    1. Main.vue(主组件)

    2. TopNav.vue(子组件...头部) 

    3. LeftAside.vue(子组件...左侧) 

    4. 配置路由

    5. 在main.js里面设置Bus总线 

    6. 效果 


    •  来了老弟话不多说哈!直接上代码了

     1. Main.vue(主组件)

    • src --> views 文件夹下创建 
    1. <template>
    2. <el-container class="main-container">
    3. <el-aside v-bind:class="asideClass">
    4. <LeftAside>LeftAside>
    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 '@/views/TopNav.vue'
    17. import LeftAside from '@/views/LeftAside.vue'
    18. // 导出模块
    19. export default {
    20. name: "Main",
    21. data: function() {
    22. return {
    23. collapsed: false
    24. }
    25. },
    26. methods: {
    27. },
    28. computed: { //计算属性
    29. asideClass: function() { //如果collapsed属性为true就展开不样式 反之就展开样式
    30. return this.collapsed ? "main-aside-collapsed" : "main-aside";
    31. }
    32. },
    33. components: { //引入组件
    34. TopNav,
    35. LeftAside
    36. },
    37. created: function() { //钩子函数
    38. this.$root.Bus.$on("Handle", value => {
    39. this.collapsed = value;
    40. });
    41. }
    42. };
    43. script>
    44. <style scoped>
    45. .main-container {
    46. height: 100%;
    47. width: 100%;
    48. box-sizing: border-box;
    49. }
    50. /* 不展开样式*/
    51. .main-aside-collapsed {
    52. /* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
    53. width: 64px !important;
    54. height: 100%;
    55. background-color: #334157;
    56. margin: 0px;
    57. }
    58. /* 展开样式*/
    59. .main-aside {
    60. width: 240px !important;
    61. height: 100%;
    62. background-color: #334157;
    63. margin: 0px;
    64. }
    65. .main-header,
    66. .main-center {
    67. padding: 0px;
    68. border-left: 2px solid #333;
    69. }
    70. style>

    2. TopNav.vue(子组件...头部) 

    •  src --> views 文件夹下创建 
    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. name: "TopNav",
    17. data: function() {
    18. return {
    19. collapsed: false,
    20. imgshow: require("../assets/img/show.png"),
    21. imgsq: require("../assets/img/sq.png")
    22. }
    23. },
    24. methods: {
    25. doToggle: function() { //主要控制collapsed为true和false
    26. this.collapsed = !this.collapsed;
    27. this.$root.Bus.$emit("Handle", this.collapsed);
    28. },
    29. exit:function(){
    30. this.$router.push({
    31. path:'/'
    32. })
    33. }
    34. }
    35. }
    36. script>
    37. <style scoped>
    38. .el-menu-vertical-demo:not(.el-menu--collapse) {
    39. border: none;
    40. }
    41. .submenu {
    42. float: right;
    43. }
    44. .buttonimg {
    45. height: 60px;
    46. background-color: transparent;
    47. border: none;
    48. }
    49. .showimg {
    50. width: 26px;
    51. height: 26px;
    52. position: absolute;
    53. top: 17px;
    54. left: 17px;
    55. }
    56. .showimg:active {
    57. border: none;
    58. }
    59. style>

    3. LeftAside.vue(子组件...左侧) 

    •  src --> views 文件夹下创建 
    1. <template>
    2. <el-menu default-active="2" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
    3. active-text-color="#ffd04b" :collapse="collapsed" :collapse-transition="bb">
    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. name: "LeftAside",
    42. data: function() {
    43. return {
    44. collapsed: false,
    45. bb: true
    46. }
    47. },
    48. methods: {},
    49. created: function() { //钩子函数
    50. this.$root.Bus.$on("Handle", value => {
    51. this.collapsed = value;
    52. });
    53. }
    54. }
    55. script>
    56. <style>
    57. .el-menu-vertical-demo:not(.el-menu--collapse) {
    58. width: 240px;
    59. min-height: 400px;
    60. }
    61. .el-menu-vertical-demo:not(.el-menu--collapse) {
    62. border: none;
    63. text-align: left;
    64. }
    65. .el-menu-item-group__title {
    66. padding: 0px;
    67. }
    68. .el-menu-bg {
    69. background-color: #1f2d3d !important;
    70. }
    71. .el-menu {
    72. border: none;
    73. }
    74. .logobox {
    75. height: 40px;
    76. line-height: 40px;
    77. color: #9d9d9d;
    78. font-size: 20px;
    79. text-align: center;
    80. padding: 20px 0px;
    81. }
    82. .logoimg {
    83. height: 40px;
    84. }
    85. style>

     4. 配置路由

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. //引入Main组件
    4. import Main from '@/views/Main'
    5. Vue.use(Router)
    6. export default new Router({
    7. routes: [{
    8. path: '/Main',
    9. name: 'Main',
    10. component: Main
    11. }
    12. ]
    13. })

    5. 在main.js里面设置Bus总线 

    1. new Vue({
    2. el: '#app',
    3. router,
    4. components: {
    5. App
    6. },
    7. template: '',
    8. data: {//Bus总线
    9. //自定义的事件总线对象,用于父子组件的通信
    10. Bus: new Vue()
    11. }
    12. })

    6. 效果 

    • 展开效果 

    •  关闭效果

  • 相关阅读:
    01-MQ介绍以及产品比较
    用ChatGPT做数据分析,提升10倍工作效率
    IDEA插件开发(14)---IntelliJ 平台工件存储库
    【一行记录】达梦timestamp转yyyy-mm-dd
    ETCD快速入门-03 常用命令
    物理不可克隆功能 (PUF)介绍
    vue华视电子身份证阅读器的使用
    前端对多对时间段进行处理 取并集合并没有交集的项
    Prim 最小生成树 图解
    Fork/Join实战和原理分析
  • 原文地址:https://blog.csdn.net/m0_63300795/article/details/126593107