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

Shinydashboard如何取消选中menuItem及修复菜单失效问题

解决方案

针对你的两个需求,我们可以通过shinyjs操作DOM和反应式变量跟踪视图状态来解决,以下是修改后的完整代码:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyjs) # 确保加载shinyjs包

shinyApp(
  ui = dashboardPage(
    header = dashboardHeader(userOutput("user")),
    sidebar = dashboardSidebar(useShinyjs(), uiOutput("sidebarpanel")),
    body = dashboardBody(uiOutput("body")),
    title = "DashboardPage"
  ),
  server = function(input, output) {
    # 定义反应式变量,跟踪当前显示的视图类型:tabs(侧边栏菜单)或personal(个人信息)
    current_view <- reactiveVal("tabs")
    
    output$user <- renderUser({
      dashboardUser(
        name = "Divad Nojnarg", 
        image = "https://adminlte.io/themes/AdminLTE/dist/img/user2-160x160.jpg", 
        title = "shinydashboardPlus",
        subtitle = "Author", 
        footer = p("The footer", class = "text-center"),
        fluidRow(
          actionButton("personalInfo","Personal Info")
        )
      )
    })
    
    # 点击Personal Info按钮时的处理
    observeEvent(input$personalInfo, {
      # 切换视图到个人信息
      current_view("personal")
      # 移除侧边栏所有菜单项的active高亮类
      removeClass(selector = ".sidebar-menu li.active", class = "active")
    })
    
    # 点击侧边栏菜单项时切换回tabs视图
    observeEvent(input$tabs, {
      current_view("tabs")
    })
    
    output$sidebarpanel <- renderUI({
      sidebarMenu(id="tabs",
                  menuItem("Dashboard 1", tabName = "dashboard1", icon = icon("dashboard")),
                  menuItem("Dashboard 2", tabName = "dashboard2", icon = icon("dashboard"))
      )
    }) 
    
    # 根据当前视图状态渲染body内容
    output$body <- renderUI({
      if(current_view() == "personal"){
        h4("Personal Info Dashboard (no menuItem)")
      } else {
        tabItems(
          tabItem(tabName ="dashboard1",
                  fluidRow(box(width = 12, h4("Dashboard 1 (menuItem)")))),
          tabItem(tabName ="dashboard2",
                  fluidRow(box(width = 12, h4("Dashboard 2 (menuItem)"))))
        )
      }
    })
  }
)

关键修改说明:

  1. 移除高亮状态:
    使用shinyjs::removeClass直接操作DOM,选中侧边栏中带有active类的菜单项,移除该类以取消高亮。

  2. 修复菜单项响应问题:

    • 新增current_view反应式变量,记录当前显示的是侧边栏菜单视图还是个人信息视图。
    • 点击侧边栏菜单项时,将current_view切换回tabs,让body重新渲染为tabItems,恢复菜单项的点击响应逻辑。
    • 不再直接覆盖output$body,而是根据状态动态渲染内容,避免破坏原有的tab切换机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:01:08