Vue项目点击侧边栏展开与折叠功能

注:带这个符号必须要有的~~~

路由配置:

{
  path: "/App",
  name: "App",
  component: () => import("../App.vue"),
}

首页App.vue

<template>
  <div id="app">
    <el-container>
      <el-header>
        <!-- 顶部栏 ~~~ -->
        <Header :name="name" @Collapse="Collapse"></Header>
      </el-header>
      <el-container>
        <!-- ~~~~ width默认200px 改一下不然固定宽度,不随缩进变化而变化 -->
        <el-aside width="asideWidth">
          <!-- 左侧栏 ~~~~~~~~~~~~~~~ Menu 有这个属性collapse是否开启折叠elementUI官网里面 -->
          <menus :isCollapse="isCollapse" />
        </el-aside>
        <el-main>
          <router-view />
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>
<script>
import Header from "@/components/header/Header.vue"; //  Header放到components文件夹里面  这里面不用写    路由    直接挂载到首页即可
import menus from "@/components/menus/menus.vue"; //  menus放到components文件夹里面  这里面不用写    路由    直接挂载到首页即可
export default {
  components: {
    Header, //   顶部栏     挂载到首页,就是这个页面
    menus, //   左侧栏     挂载到首页,就是这个页面
  },
  provide() {
    return {};
  },
  data() {
    return {
      // ~~~~~~打开左侧栏状态
      isCollapse: false,
    };
  },
  methods: {
    // ~~~
    Collapse() {
      this.isCollapse = !this.isCollapse;
    },
  },
  computed: {
    // ~~~可加可不加	 src文件夹下 找到store状态管理里面的js文件里面加这个属性		state: { isCollapse: false,}
    asideWidth() {
      return this.$store.state.isCollapse ? "auto" : "200px";
    },
  },
};
</script>

顶部栏header.vue

<template>
  <div class="box">
    <el-row :gutter="20">
      <el-col :span="8">
        <div>
          <!-- 要按照 npm i element-ui -S  才可以看到图标或者用img下载自己想要的图片  ~~~ -->
          <i
            :class="isCollapse ? 'el-icon-s-fold' : 'el-icon-s-unfold'"
            @click="Collapse"
          ></i>
          <span>{{ name }}</span>
        </div>
      </el-col>
      <el-col :span="8"> </el-col>
      <el-col :span="8"> </el-col>
    </el-row>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "点击",
      // ~~~
      isCollapse: false,
    };
  },
  methods: {
    // ~~~
    Collapse() {
      this.isCollapse = !this.isCollapse;
      this.$emit("Collapse");
    },
  },
};
</script>

侧边栏menus.vue

<template>
  <el-menu
    class="menu-nav"
    router
    :default-active="this.$router.path"
    :collapse="isCollapse">
     <!-- ~~~必须要的属性是否开启折叠el-menu :collapse="isCollapse" -->
  </el-menu>
</template>

<script>
export default {
  // ~~~
  props: ['isCollapse'],
}
</script>

最后这个效果
请添加图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Vue 侧边导航展开折叠的源码示例: ``` <template> <div class="sidebar-container"> <div class="sidebar"> <ul> <li v-for="(item, index) in menuList" :key="index"> <a href="#" @click="toggleSubmenu(index)"> <i :class="item.icon"></i> <span>{{ item.title }}</span> <span v-if="item.submenu" class="submenu-toggle"> <i class="fa fa-chevron-down" v-show="!item.open"></i> <i class="fa fa-chevron-up" v-show="item.open"></i> </span> </a> <ul v-if="item.submenu" :class="{ 'submenu-open': item.open }"> <li v-for="(subitem, subindex) in item.submenu" :key="subindex"> <a :href="subitem.link">{{ subitem.title }}</a> </li> </ul> </li> </ul> </div> </div> </template> <script> export default { data() { return { menuList: [ { title: "Dashboard", icon: "fa fa-tachometer", submenu: [ { title: "Analytics", link: "/dashboard/analytics" }, { title: "Sales", link: "/dashboard/sales" } ] }, { title: "Products", icon: "fa fa-cubes", submenu: [ { title: "All Products", link: "/products/all" }, { title: "Add New", link: "/products/add-new" } ] } ] }; }, methods: { toggleSubmenu(index) { this.menuList[index].open = !this.menuList[index].open; } } }; </script> <style> .sidebar-container { display: flex; flex-direction: row; height: 100vh; } .sidebar { background-color: #333; color: #fff; width: 200px; } ul { list-style: none; margin: 0; padding: 0; } li { border-bottom: 1px solid #555; } a { color: #fff; display: flex; align-items: center; padding: 10px; text-decoration: none; transition: background-color 0.2s ease; } a:hover { background-color: #444; } i { margin-right: 10px; } .submenu-toggle { margin-left: auto; } .submenu-open { display: block; } </style> ``` 在这个示例中,我们的侧边被包含在一个 `.sidebar-container` 容器中,并采用了 Flexbox 布局。我们定义了一个简单的样式来呈现侧边的外观。 在 `data` 中,我们定义了一个 `menuList` 数组,其中包含每个菜单项的标题、图标和子菜单(如果有的话)。我们还添加了一个 `open` 属性来追踪每个菜单项的展开状态。 在模板中,我们使用 `v-for` 指令来循环遍历 `menuList`,并使用 `v-if` 指令来检查菜单项是否有子菜单。我们还添加了一个 `@click` 事件监听器,以便在用户单菜单项时切换子菜单的展开状态。 在样式中,我们定义了一些基本的样式来呈现菜单项和子菜单的外观。我们使用 `.submenu-open` 类来控制子菜单的可见性。 请注意,这只是一个简单的示例,您可能需要根据自己的需求进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值