讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue.js:精确控制点击LI时内部UL的显示样式

轻明同学_6577

轻明同学_6577

发布时间:2025-11-20 12:20:25

|

1042人浏览过

|

来源于php中文网

原创

Vue.js:精确控制点击LI时内部UL的显示样式

本文详细介绍了在vue.js应用中,如何精确控制点击特定的

  • 元素时,仅其内部嵌套的
      子菜单显示或隐藏,而非影响所有子菜单。通过为每个可切换的子菜单维护独立的响应式状态,并利用vue的动态类绑定机制,实现对ui元素的精细化控制,有效避免了全局状态管理带来的副作用。

      在构建交互式前端界面时,常见的需求是实现菜单项的展开与收起功能。特别是在多级菜单结构中,当用户点击某个父级菜单项(

    • )时,我们期望只有该父级菜单项下的子菜单(
        )能够切换显示状态,而不是所有同级或不同级的子菜单都响应。本教程将深入探讨如何使用Vue.js的Composition API来高效、精确地实现这一功能。

        问题分析

        原始的问题场景中,开发者尝试使用一个单一的响应式变量 sub_menu_show 来控制所有子菜单的显示状态。这种方法的问题在于,当 sub_menu_show 的值发生变化时,所有绑定到该变量的子菜单都会同时更新状态,导致点击一个菜单项时,所有子菜单都展开或收起,这显然不符合预期。

        为了实现精确控制,核心思路是为每个需要独立控制显示状态的子菜单维护一个独立的布尔值。

        解决方案:独立状态管理

        我们将采用一个对象来存储每个子菜单的显示状态,对象的键可以是子菜单的唯一标识符(例如,'profile' 或 'media'),值则是一个布尔类型,表示该子菜单是否处于显示状态。

        立即学习“前端免费学习笔记(深入)”;

        1. HTML 结构调整

        首先,我们需要修改模板,确保每个可点击的

        Html2md
        Html2md

        使用 Readability + Turndown 将 HTML 页面转换为干净的、Agent 友好的 Markdown。去除导航栏、广告、页脚、Cookie 横幅、社交按钮等干扰元素。支持 URL...

        下载
      • 元素能够传递一个唯一的标识符给我们的切换函数,并且每个
          子菜单能够根据其对应的独立状态来动态绑定类。
          <ul>
             <li>菜单项</li>
             <li @click="() => toggleSubMenu('profile')">个人资料
                <ul :class="{ 'd-block': toggleStates['profile'] }">
                    <li>历史记录</li>
                </ul>
             </li>
             <li @click="() => toggleSubMenu('media')">媒体
                <ul :class="{ 'd-block': toggleStates['media'] }">
                    <li>照片</li>
                    <li>视频</li>
                </ul>
             </li>
          </ul>

          关键点说明:

          • @click="() => toggleSubMenu('profile')":当点击“个人资料”
          • 时,调用 toggleSubMenu 函数,并传入字符串 'profile' 作为该子菜单的唯一标识符。
          • :class="{ 'd-block': toggleStates['profile'] }":这里使用Vue的动态类绑定。当 toggleStates 对象中 profile 属性的值为 true 时,d-block 类会被添加到该
              元素上;否则,该类不会被添加。d-block 通常是一个CSS类,用于将元素的 display 属性设置为 block,使其可见。

          2. Vue.js 逻辑实现

          接下来,我们将在Vue的 setup 函数中实现状态管理和切换逻辑。我们将使用 ref 来创建一个响应式对象,用于存储所有子菜单的独立状态。

          <script>
          import { ref } from 'vue'
          
          export default {
              setup(){
                  // 使用 ref 创建一个响应式对象,用于存储每个子菜单的显示状态
                  // 初始时,所有子菜单都设置为隐藏 (false)
                  const toggleStates = ref({ profile: false, media: false });
          
                  /**
                   * 切换指定类型子菜单的显示状态
                   * @param {string} type - 子菜单的唯一标识符(如 'profile', 'media')
                   */
                  const toggleSubMenu = (type) => {
                      // 根据传入的 type 切换对应子菜单的状态
                      // 例如,如果 toggleStates.value['profile'] 是 false,则变为 true
                      toggleStates.value[type] = !toggleStates.value[type];
                  }
          
                  // setup 函数需要返回在模板中使用的响应式数据和方法
                  return {
                      toggleSubMenu,
                      toggleStates
                  }
              }
          }
          </script>

          关键点说明:

          • import { ref } from 'vue':从Vue中导入 ref 函数。ref 用于创建响应式数据,它可以包装任何类型的值(包括对象、数组、基本类型)。
          • const toggleStates = ref({ profile: false, media: false });:我们初始化了一个名为 toggleStates 的 ref,它的 .value 是一个对象。这个对象包含了我们所有子菜单的初始状态,默认为 false(隐藏)。
          • toggleStates.value[type] = !toggleStates.value[type];:在 toggleSubMenu 函数中,我们通过 type 参数动态访问 toggleStates.value 对象中的对应属性,并将其布尔值进行反转。请注意,当 ref 包装的是一个对象时,我们需要通过 .value 属性来访问和修改其内部的实际值。
          • return { toggleSubMenu, toggleStates }:setup 函数返回一个对象,其中包含了在模板中需要使用的响应式数据 (toggleStates) 和方法 (toggleSubMenu)。

          3. CSS 样式(示例)

          为了让 d-block 类生效,您需要在您的CSS文件中定义它:

          /* style.css 或组件内部样式 */
          ul ul { /* 默认子菜单隐藏 */
              display: none;
          }
          
          ul ul.d-block { /* 添加 d-block 类时显示 */
              display: block;
          }

          总结与注意事项

          • 独立状态管理是关键: 通过为每个需要独立控制的UI元素维护其自身的响应式状态,可以避免全局状态污染,实现精确的控制。
          • ref 的使用: 在Vue 3 Composition API中,ref 是创建响应式变量的常用方法。当 ref 包装的是对象时,访问和修改其内部属性需要通过 .value。
          • 动态类绑定: :class 属性可以接受一个对象,对象的键是类名,值是布尔表达式。当表达式为 true 时,类名被添加;为 false 时,类名被移除。
          • 可扩展性: 这种方法具有很好的可扩展性。如果未来需要添加更多的子菜单,只需在 toggleStates 对象中添加新的键值对,并在HTML中相应地绑定即可,无需修改核心逻辑。
          • 代码可读性: 明确的标识符(如 'profile', 'media')使得代码更易于理解和维护。

          通过上述方法,您可以轻松地在Vue.js应用中实现复杂且精确的UI交互,确保每个组件都能按照预期独立运行。

  • 热门AI工具

    更多
    二狗PPT
    二狗PPT Hot

    一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

    WorkBuddy

    一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

    豆包大模型

    豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

    SkildArt
    SkildArt Hot

    SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

    PixTV
    PixTV Hot

    PixTV是一款面向AIGC内容创作的AI视频生成工具。

    DeepSeek

    DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

    PixPix
    PixPix Hot

    PixPix是一款面向电商视觉生产的AI商品图生成工具。

    小橡皮AI

    一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

    Seko
    Seko Hot

    一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

    相关专题

    更多
    mysql标识符无效错误怎么解决
    mysql标识符无效错误怎么解决

    mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    15540

    2023.12.04

    Python标识符有哪些
    Python标识符有哪些

    Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    1143

    2024.02.23

    java标识符合集
    java标识符合集

    本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

    8610

    2025.06.11

    c++标识符介绍
    c++标识符介绍

    本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

    3402

    2025.08.07

    c语言const用法
    c语言const用法

    const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

    2278

    2023.09.20

    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    1798

    2023.08.03

    js截取字符串的方法
    js截取字符串的方法

    js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

    2824

    2023.09.04

    java基础知识汇总
    java基础知识汇总

    java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

    6164

    2023.10.24

    Gradle插件开发入门教程
    Gradle插件开发入门教程

    本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

    60

    2026.10.22

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Sass 教程
    Sass 教程

    共14课时 | 1.5万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 6.1万人学习

    CSS教程
    CSS教程

    共754课时 | 98.9万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn