当前位置:首页 > VUE

vue 实现侧边栏

2026-01-19 02:55:46VUE

使用 Vue 实现侧边栏

基于 Vue Router 的侧边栏导航

在 Vue 项目中,可以通过 Vue Router 结合组件化开发实现侧边栏导航。创建一个 Sidebar.vue 组件,动态渲染路由菜单:

vue 实现侧边栏

<template>
  <div class="sidebar">
    <ul>
      <li v-for="route in routes" :key="route.path">
        <router-link :to="route.path">{{ route.name }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      routes: [
        { path: '/home', name: '首页' },
        { path: '/about', name: '关于' },
        { path: '/contact', name: '联系' }
      ]
    }
  }
}
</script>

<style>
.sidebar {
  width: 200px;
  background: #f0f0f0;
  padding: 20px;
}
.sidebar ul {
  list-style: none;
  padding: 0;
}
.sidebar li {
  margin-bottom: 10px;
}
</style>

可折叠侧边栏

通过 Vue 的响应式数据和条件渲染实现侧边栏的展开/折叠功能:

vue 实现侧边栏

<template>
  <div class="sidebar" :class="{ 'collapsed': isCollapsed }">
    <button @click="toggleSidebar">
      {{ isCollapsed ? '展开' : '折叠' }}
    </button>
    <ul v-show="!isCollapsed">
      <li v-for="route in routes" :key="route.path">
        <router-link :to="route.path">{{ route.name }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCollapsed: false,
      routes: [
        { path: '/home', name: '首页' },
        { path: '/about', name: '关于' },
        { path: '/contact', name: '联系' }
      ]
    }
  },
  methods: {
    toggleSidebar() {
      this.isCollapsed = !this.isCollapsed
    }
  }
}
</script>

<style>
.sidebar {
  width: 200px;
  transition: width 0.3s;
}
.sidebar.collapsed {
  width: 50px;
}
</style>

使用 UI 框架实现

许多 Vue UI 框架提供了现成的侧边栏组件,如 Element UI 的 el-menu

<template>
  <el-menu
    default-active="1"
    class="el-menu-vertical"
    background-color="#545c64"
    text-color="#fff"
    active-text-color="#ffd04b">
    <el-menu-item index="1">
      <i class="el-icon-menu"></i>
      <span>首页</span>
    </el-menu-item>
    <el-menu-item index="2">
      <i class="el-icon-document"></i>
      <span>文档</span>
    </el-menu-item>
  </el-menu>
</template>

<script>
import { Menu, MenuItem } from 'element-ui'
export default {
  components: {
    'el-menu': Menu,
    'el-menu-item': MenuItem
  }
}
</script>

响应式侧边栏

结合媒体查询和 Vue 的响应式数据,实现移动端友好的侧边栏:

<template>
  <div>
    <button @click="showMobileMenu = true" class="mobile-menu-button">
      菜单
    </button>
    <div class="sidebar" :class="{ 'mobile-show': showMobileMenu }">
      <button @click="showMobileMenu = false" class="close-button">
        ×
      </button>
      <ul>
        <li v-for="route in routes" :key="route.path">
          <router-link :to="route.path">{{ route.name }}</router-link>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      showMobileMenu: false,
      routes: [
        { path: '/home', name: '首页' },
        { path: '/about', name: '关于' },
        { path: '/contact', name: '联系' }
      ]
    }
  }
}
</script>

<style>
.sidebar {
  width: 250px;
}
.mobile-menu-button {
  display: none;
}
@media (max-width: 768px) {
  .sidebar {
    position: fixed;
    top: 0;
    left: -250px;
    height: 100%;
    transition: left 0.3s;
    background: #fff;
    z-index: 100;
  }
  .sidebar.mobile-show {
    left: 0;
  }
  .mobile-menu-button {
    display: block;
  }
}
</style>

标签: 侧边vue
分享给朋友:

相关文章

vue如何实现放大缩小

vue如何实现放大缩小

Vue实现放大缩小功能的方法 在Vue中实现元素的放大缩小功能,可以通过CSS变换、第三方库或直接操作DOM样式来实现。以下是几种常见的方法: 使用CSS transform属性 通过绑定Vue的d…

vue实现socket

vue实现socket

Vue 中实现 WebSocket 通信 在 Vue 项目中实现 WebSocket 通信可以通过原生 WebSocket API 或第三方库(如 socket.io-client)完成。以下是两种常…

vue实现试卷

vue实现试卷

Vue实现试卷系统的基本思路 使用Vue.js构建试卷系统需要结合组件化开发、状态管理和后端数据交互。核心功能包括题目展示、答题逻辑、计时器和提交答案。 核心功能模块划分 试卷组件结构 试卷容器组…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…

vue首页实现

vue首页实现

实现Vue首页的基本步骤 创建一个Vue首页通常涉及项目初始化、页面结构设计、路由配置和组件开发。以下是具体实现方法: 初始化Vue项目 使用Vue CLI或Vite快速搭建项目结构: npm i…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…