若依ruoyi左侧菜单栏增加新的主题色

操作步骤

1.添加自定义模板

src/layout/components/Settings/index.vue 目录下30行左右新增

			<div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-blue')">
              <img src="@/assets/images/blue.svg" alt="custom">
              <div v-if="sideTheme === 'theme-blue'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
                <i aria-label="图标: check" class="anticon anticon-check">
                  <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class="">
                    <path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z"/>
                  </svg>
                </i>
              </div>
            </div>

2. variables.scss

//新增样式名
$base-menu-blue-background:#0043B2;
$blue-sub-menu-background:#003793;
$blue-sub-menu-hover:#023281;

//新增导出
:export {
......
menuBlueBackground:$base-menu-blue-background;
}

这里的变量名可以自定义,但还是要注意和后面的一一对应

3.Logo.vue

<template>
  <div class="sidebar-logo-container" :class="{'collapse':collapse}" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : sideTheme === 'theme-blue' ? variables.menuBlueBackground : variables.menuLightBackground }">
    <transition name="sidebarLogoFade">
      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
        <img v-if="logo" :src="logo" class="sidebar-logo" />
        <h1 v-else class="sidebar-title" :style="{color:(sideTheme === 'theme-dark' || sideTheme === 'theme-blue') ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
      </router-link>
      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
        <img v-if="logo" :src="logo" class="sidebar-logo" />
        <h1 class="sidebar-title" :style="{ color: (sideTheme === 'theme-dark' || sideTheme === 'theme-blue') ? variables.logoTitleColor : variables.logoLightTitleColor }">{{ title }} </h1>
      </router-link>
    </transition>
  </div>
</template>

修改动态的style

4.Siderbar目录下的index.vue

//主要修改el-menu的这两个属性
    :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBackground : settings.sideTheme === 'theme-blue' ? variables.menuBlueBackground : variables.menuLightBackground"
    
    :text-color="settings.sideTheme === 'theme-dark' ? variables.menuColor : settings.sideTheme === 'theme-blue' ? variables.menuColor : variables.menuLightColor"
    
    第2行修改
    <div :class="{'has-logo':showLogo}" :style="{ backgroundColor: settings.sideTheme === 'theme-dark' ? variables.menuBackground : settings.sideTheme === 'theme-blue' ? variables.menuBlueBackground : variables.menuLightBackground }">           

主题切换-效果图如下:

在这里插入图片描述

在这里插入图片描述

<think>嗯,用户正在使用RuoYi-Vue框架开发项目,遇到了关于左侧菜单栏二级菜单展开的问题。用户想要在点击二级菜单后固定显示二级子菜单,不自动折叠。这其实是个很典型的ElementUI菜单交互优化需求。从用户描述和提供的引用内容来看,问题核心在于RuoYi框架默认启用了手风琴模式(accordion),导致多个二级菜单同时展开时会出现相互冲突。引用[3]提到了在<Menu>组件上添加accordion属性就能控制展开行为,但用户需要的是反模式——固定展开二级菜单而不折叠。参考引用[1]中提到的“开启默认展开”功能,结合引用[5]的DOM操作思路,解决方案应该集中在两方面:1)修改组件本身的展开行为属性;2)可能需要的状态管理配合。特别要注意的是,RuoYi框架通过Vuex管理菜单状态,所以操作时要考虑状态持久化的问题。用户似乎已经查阅过一些资料(引用了5个相关解决方案),但还没找到完全匹配的方案。ta的表述很专业,说明有一定前端基础。考虑到RuoYi的菜单组件基于ElementUI的el-menu,关键修改点应该在Sidebar组件的index.vue文件中。值得注意的细节是引用[4]提到了激活状态的样式控制,暗示可能需要同步调整样式以避免视觉冲突。由于是框架修改,建议用户先定位到菜单折叠的状态管理方法(toggleSideBarHide),再解除二级菜单的自动折叠约束。</think> 针对RuoYi框架中固定显示二级子菜单的需求,结合引用内容及Element UI特性,提供以下解决方案(请修改文件`src/layout/components/Sidebar/index.vue`): ### 解决方案步骤 1. **关闭手风琴模式** 移除`el-menu`的`accordion`属性(若有),确保多个二级菜单可同时展开 ```html <el-menu :default-active="activeMenu" :collapse="isCollapse" :unique-opened="false" <!-- 关键修改 --> background-color="#304156" > ``` 2. **强制保持二级菜单展开状态** 在`el-submenu`中添加`:popper-append-to-body="false"`防止DOM被移除 ```html <el-submenu v-for="child in item.children" :key="child.path" :index="child.path" :popper-append-to-body="false" <!-- 关键属性 --> > ``` 3. **状态持久化(可选)** 在Vuex的`app`模块(`src/store/modules/app.js`)中添加状态记录: ```javascript state: { openedSubmenus: [] // 存储展开的二级菜单path }, mutations: { SET_SUBMENU_STATE(state, paths) { state.openedSubmenus = paths } } ``` 4. **初始化展开菜单** 在`Sidebar/index.vue`中获取存储的展开状态: ```javascript computed: { defaultOpeneds() { return this.$store.state.app.openedSubmenus } } ``` 绑定到`el-menu`: ```html <el-menu :default-openeds="defaultOpeneds"> ``` 5. **点击菜单时更新状态** 监听菜单展开事件: ```javascript methods: { handleSubmenuOpen(index) { const opened = [...this.$store.state.app.openedSubmenus, index] this.$store.commit('SET_SUBMENU_STATE', [...new Set(opened)]) } } ``` ### 补充说明 1. **样式微调** 如需固定展开后调整布局(引用[5]),在`appMain`容器添加动态class: ```css .main-container.expanded { margin-left: 230px !important; } ``` 2. **激活状态标识** 参考引用[4]的样式逻辑,确保激活菜单视觉正确: ```css .el-menu-item.is-active { background-color: #00d3c4 !important; } ``` > 注意事项:若需兼容移动端,需在`toggleSideBar`方法中增加状态同步逻辑(引用[5])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石马农汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值