Skip to content

YqCollapseSidebar

YqCollapseSidebar 是一个可折叠侧边栏控制组件,用于管理应用侧边栏的展开/折叠状态。该组件提供以下核心功能:

  • 通过点击按钮切换侧边栏状态
  • 支持自定义展开/折叠图标
  • 支持状态持久化存储
  • 提供丰富的交互反馈和动画效果
  • 完全响应式设计,适配不同屏幕尺寸

1 使用示例

vue
<template>
  <YqCollapseSidebar
    v-model="isCollapsed"
    class="sidebar-toggle"
    @toggle="handleToggle"
    collapsedIcon="fa-solid fa-angles-right"
    expandedIcon="fa-solid fa-angles-left"
  />

  <div class="demo-container">
    <!-- 侧边栏 -->
    <div
      class="demo-sidebar"
      :class="{ collapsed: isCollapsed }"
      :style="{ width: isCollapsed ? '60px' : '250px' }"
    >
      <div class="sidebar-content">
        <h3 v-show="!isCollapsed">菜单标题</h3>
        <ul>
          <li>
            <YqIcon icon="fa-solid fa-home" />
            <span v-show="!isCollapsed">首页</span>
          </li>
          <li>
            <YqIcon icon="fa-solid fa-user" />
            <span v-show="!isCollapsed">用户</span>
          </li>
          <li>
            <YqIcon icon="fa-solid fa-cog" />
            <span v-show="!isCollapsed">设置</span>
          </li>
        </ul>
      </div>
    </div>

    <!-- 主内容区 -->
    <div class="demo-main">
      <h1>主内容区</h1>
      <p>当前侧边栏状态: {{ isCollapsed ? "折叠" : "展开" }}</p>
      <p>尝试点击左侧的折叠按钮</p>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from "vue";
const isCollapsed = ref(false);

const handleToggle = (collapsed: boolean) => {
  isCollapsed.value = collapsed;
};
</script>

<style scoped lang="scss">
.demo-container {
  display: flex;
  height: 400px;
  border: 1px solid #eee;
  position: relative;
}

.demo-sidebar {
  position: relative;
  background-color: #f8f8f8;
  border-right: 1px solid #ddd;
  transition: width 0.3s ease;
  overflow: hidden;

  &.collapsed {
    .sidebar-content h3,
    .sidebar-content ul li span {
      display: none;
    }
  }
}

.sidebar-content {
  padding: 20px;

  h3 {
    margin-bottom: 20px;
    color: var(--yq-color-primary);
    transition: opacity 0.3s ease;
  }

  ul {
    list-style: none;
    padding: 0;

    li {
      padding: 10px 0;
      display: flex;
      align-items: center;
      gap: 10px;
      color: #666;

      &:hover {
        color: var(--yq-color-primary);
        cursor: pointer;
      }
    }
  }
}

.demo-main {
  flex: 1;
  padding: 20px;
  background-color: white;
}

.sidebar-toggle {
  position: absolute;
  left: 0px;
  top: 50px;
  z-index: 101;
}
</style>

2 组件属性

属性名类型默认值说明
modelValueBooleanfalse使用 v-model 绑定的侧边栏状态
initialCollapsedBooleanfalse初始折叠状态
expandedIconString'fa-solid fa-angles-left'展开状态下显示的图标
collapsedIconString'fa-solid fa-angles-right'折叠状态下显示的图标
sidebarWidthNumber250侧边栏展开时的宽度(px)
persistStateBooleanfalse是否持久化存储状态
storageKeyString'yq-sidebar-state'本地存储使用的键名

3 组件事件

事件名参数说明
update:modelValueBoolean状态变更时触发(用于 v-model)
toggleBoolean状态切换时触发

4 样式定制

4.1 通过 CSS 变量定制

css
:root {
  --yq-color-primary: #409eff; /* 主色调 */
  --yq-color-primary-light-3: #79bbff; /* 悬停色调 */
}

4.2 通过类名覆盖

css
.yq-collapse-sidebar {
  /* 覆盖默认样式 */
  background-color: #ff0000;
  width: 30px;
  height: 30px;
}

5 高级用法

5.1 状态持久化

启用状态持久化后,组件会将折叠状态保存到 localStorage 中:

vue
<YqCollapseSidebar
  v-model="isCollapsed"
  :persistState="true"
  storageKey="custom-storage-key"
/>

5.2 自定义图标

使用 FontAwesome 或其他图标库自定义图标:

vue
<YqCollapseSidebar
  v-model="isCollapsed"
  collapsedIcon="fa-solid fa-chevron-right"
  expandedIcon="fa-solid fa-chevron-left"
/>

5.3 插槽内容

通过默认插槽添加自定义文本:

vue
<YqCollapseSidebar v-model="isCollapsed">
  {{ isCollapsed ? '展开' : '折叠' }}
</YqCollapseSidebar>

6 最佳实践

6.1 与侧边栏配合使用

vue
<template>
  <YqCollapseSidebar v-model="isCollapsed" />

  <div class="app-layout">
    <div class="sidebar" :style="{ width: isCollapsed ? '60px' : '250px' }">
      <!-- 侧边栏内容 -->
    </div>

    <div
      class="main-content"
      :style="{ marginLeft: isCollapsed ? '60px' : '250px' }"
    >
      <!-- 主内容区 -->
    </div>
  </div>
</template>

<style>
.app-layout {
  transition: margin-left 0.3s ease;
}

.sidebar {
  transition: width 0.3s ease;
}
</style>

6.2 响应式设计

结合媒体查询实现响应式:

css
@media (max-width: 768px) {
  .yq-collapse-sidebar {
    display: none; /* 在小屏幕上隐藏折叠按钮 */
  }

  .sidebar {
    width: 100% !important;
  }

  .main-content {
    margin-left: 0 !important;
  }
}

6.3 重置持久化存储的状态

javascript
localStorage.removeItem("yq-sidebar-state"); // 或自定义的storageKey

6.4 控制按钮的位置

css
.yq-collapse-sidebar {
  top: 20px !important; /* 调整垂直位置 */
  left: auto !important;
  right: 10px !important; /* 调整水平位置 */
}