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

Vue JavaScript实现点击li只为内部对应ul添加样式的问题

解决Vue中点击单个li仅激活对应子ul样式的问题

你当前的问题在于使用了一个全局的sub_menu_show变量控制所有子菜单的显示状态,导致点击任何一个li都会同时切换所有子ul的样式。要实现单个菜单独立控制,有以下几种可行方案:

方案1:用标识跟踪当前激活菜单(适合多菜单场景)

通过存储当前激活菜单的唯一标识,让每个子ul只在对应标识匹配时应用样式。

修改Vue代码

import { reactive } from 'vue'

export default {
    setup(){
        const data = reactive({
            activeMenu: null, // 存储当前激活的菜单ID,比如'profile'/'media'
        });

        const toggleSubMenu = (menuId) => {
            // 点击已激活的菜单则关闭,否则切换到该菜单
            data.activeMenu = data.activeMenu === menuId ? null : menuId
        }

        return{
            data,
            toggleSubMenu
        }
    }
}

修改HTML结构

给每个点击的li传递对应菜单标识,子ul的class绑定判断当前激活标识是否匹配:

<ul>
   <li>Menu</li>
   <li @click="toggleSubMenu('profile')">Profile
      <ul :class="{ 'd-block': data.activeMenu === 'profile' }">
          <li>History</li>
      </ul>
   </li>
   <li @click="toggleSubMenu('media')">Media
      <ul :class="{ 'd-block': data.activeMenu === 'media' }">
          <li>Photos</li>
          <li>Videos</li>
      </ul>
   </li>
</ul>

方案2:给每个菜单设置独立布尔状态(适合少菜单场景)

为每个子菜单单独设置布尔变量,直接控制对应ul的显示。

修改Vue代码

import { reactive } from 'vue'

export default {
    setup(){
        const data = reactive({
            profileMenuShow: false,
            mediaMenuShow: false,
        });

        const toggleSubMenu = (menuKey) => {
            data[menuKey] = !data[menuKey]
        }

        return{
            data,
            toggleSubMenu
        }
    }
}

修改HTML结构

<ul>
   <li>Menu</li>
   <li @click="toggleSubMenu('profileMenuShow')">Profile
      <ul :class="{ 'd-block': data.profileMenuShow }">
          <li>History</li>
      </ul>
   </li>
   <li @click="toggleSubMenu('mediaMenuShow')">Media
      <ul :class="{ 'd-block': data.mediaMenuShow }">
          <li>Photos</li>
          <li>Videos</li>
      </ul>
   </li>
</ul>

方案3:动态菜单场景(数组循环渲染)

如果菜单是从后端获取或动态生成的,可以将菜单数据与状态绑定在一起:

Vue代码

import { reactive } from 'vue'

export default {
    setup(){
        const data = reactive({
            menus: [
                { id: 'profile', name: 'Profile', items: ['History'], show: false },
                { id: 'media', name: 'Media', items: ['Photos', 'Videos'], show: false },
            ]
        });

        const toggleSubMenu = (menu) => {
            menu.show = !menu.show
        }

        return{
            data,
            toggleSubMenu
        }
    }
}

HTML结构

<ul>
   <li>Menu</li>
   <li v-for="menu in data.menus" :key="menu.id" @click="toggleSubMenu(menu)">
      {{ menu.name }}
      <ul :class="{ 'd-block': menu.show }">
          <li v-for="item in menu.items" :key="item">{{ item }}</li>
      </ul>
   </li>
</ul>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:01:02