You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何点击汉堡按钮后将Vue2的导航抽屉收缩为迷你版本?

解决方案

问题根源:当前汉堡按钮触发的是切换抽屉的显示/隐藏状态(toggleDrawer),而非控制抽屉的迷你模式(mini-variant),导致点击后抽屉直接消失。我们需要调整逻辑,让汉堡按钮控制抽屉的迷你/展开状态,而非显示/隐藏。

1. 更新Vuex状态管理(custom.js)

添加miniDrawer状态来管理迷你模式,同时保留toggleDrawer用于抽屉的显示/隐藏(若不需要可移除):

const state = {
    toggleDrawer: true, // 抽屉默认显示
    miniDrawer: true    // 默认开启迷你模式
};

const mutations = {
    // 切换抽屉显示/隐藏(可选保留)
    toggleDrawer: (state) => state.toggleDrawer = !state.toggleDrawer,
    // 设置迷你模式状态
    setMiniDrawer: (state, value) => state.miniDrawer = value,
    // 切换迷你模式(可选,用于双向切换)
    toggleMiniDrawer: (state) => state.miniDrawer = !state.miniDrawer
};

export default {
    namespaced: true,
    state,
    mutations
};

2. 修改导航栏(Navbar.vue)

将汉堡按钮的点击事件改为触发迷你模式的设置(这里实现点击后强制收缩为迷你模式,若需要双向切换可改用toggleMiniDrawer):

<template>
  <v-app-bar app>
    <v-app-bar-nav-icon @click="setMiniDrawer(true)"></v-app-bar-nav-icon>
    <v-toolbar-title>Application</v-toolbar-title>
  </v-app-bar>
</template>

<script>
import { mapMutations } from 'vuex'

export default {
  methods: {
    ...mapMutations('custom', ['setMiniDrawer'])
  }
}
</script>

3. 修改导航抽屉(NavDrawer.vue)

将迷你模式的状态绑定到Vuex的miniDrawer,并通过computed实现双向同步(确保点击抽屉元素时能自动更新Vuex状态):

<template>
    <v-navigation-drawer
      app
      :mini-variant.sync="mini"
      v-model="toggleDrawer"   
    >
    <v-list>
      <v-list-item class="px-2">
        <v-list-item-avatar>
          <v-img src="https://randomuser.me/api/portraits/men/85.jpg"></v-img>
        </v-list-item-avatar>
        <v-list-item-title>John Leider</v-list-item-title>
      </v-list-item>
    </v-list>
    <v-divider></v-divider>
    <v-list nav>
      <v-list-item-group
        v-model="selectedItem"
        color="primary"
      >
        <v-list-item
          v-for="item in items"
          :key="item.text"
        >
          <v-list-item-icon>
            <v-icon>{{ item.icon }}</v-icon>
          </v-list-item-icon>
          <v-list-item-content>
              <v-list-item-title>{{ item.text }}</v-list-item-title>
          </v-list-item-content>
        </v-list-item>
      </v-list-item-group>
    </v-list>
  </v-navigation-drawer>
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
  data () {
    return {
      selectedItem: 0,
      items: [
        { text: "1", icon: "mdi-airplane" },
        { text: "2", icon: "mdi-ferry" },
        { text: "3", icon: "mdi-truck" }
      ]
    }
  },
  computed: {
    ...mapState('custom', ['toggleDrawer', 'miniDrawer']),
    // 实现mini-variant与Vuex状态的双向同步
    mini: {
      get() {
        return this.miniDrawer
      },
      set(value) {
        this.setMiniDrawer(value)
      }
    }
  },
  methods: {
    ...mapMutations('custom', ['setMiniDrawer'])
  }
}
</script>

效果说明

  • 初始状态:抽屉以迷你模式显示(仅图标)
  • 点击抽屉内元素:抽屉自动展开(显示文字)
  • 点击汉堡按钮:抽屉收缩回迷你模式(仅图标,不会消失)

内容的提问来源于stack exchange,提问作者mustafa00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:25:41