繁体   English   中英

闪亮的仪表板。 如何取消选择菜单项?

[英]Shinydashboard. How to unselect menuItem?

我有这段代码:

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)

shinyApp(
  ui = dashboardPage(
    header = dashboardHeader(userOutput("user")),
    sidebar = dashboardSidebar(shinyjs::useShinyjs(),uiOutput("sidebarpanel")),
    body = dashboardBody(uiOutput("body")),
    title = "DashboardPage"
  ),
  server = function(input, output) {
    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")
        )
      )
    })
    
    observeEvent(input$personalInfo, {
      output$body <- renderUI({h4("Personal Info Dahsboard (no menuItem)")})
    })
    
    output$sidebarpanel <- renderUI({
        sidebarMenu(id="tabs",
                        menuItem("Dashboard 1", tabName = "dashboard1", icon = icon("dashboard"))        
                        ,menuItem("Dashboard 2", tabName = "dashboard2", icon = icon("dashboard"))
        )
    }) 
    
    output$body <- renderUI({
      
      tabItems(
        tabItem(tabName ="dashboard1",
                fluidRow(box(width = 12, h4("Dashboard 1 (menuItem)"))))
        ,tabItem(tabName ="dashboard2",
                 fluidRow(box(width = 12, h4("Dashboard 2 (menuItem)"))))
      )
    })
  }
)

我想做两件事:

首先:当我点击“个人信息”按钮时,然后,防止 menuItem 被遮蔽(我假设我需要删除类“selected”或“active”或类似的东西)

在此处输入图像描述

第二:我想解决这个问题:按下“个人信息”按钮后,菜单项不起作用:

在此处输入图像描述

正如我之前在此处的回答中所示,我们可以使用隐藏的menuItem独立于可见选择的menuItem来修改正文内容。

此外,我建议在这种情况下停止使用renderUI 一般来说,重新渲染 UI 元素而不是更新现有元素会更慢(这里我们可以通过updateTabItems切换到隐藏的 menuItem - 然而,这也适用于例如使用updateSelectInput而不是renderUI({selectInput(...)}) )。 在这种情况下,您还应该质疑是否真的需要在服务器端创建dashboardUser

如果您确实需要服务器端生成的dashboardSidebar ,您仍然不应该使用renderUI - renderMenu() / sidebarMenuOutput()函数可用于此。 请在此处查看相关文档。

library(shiny)
library(shinyjs)
library(shinydashboard)
library(shinydashboardPlus)

shinyApp(
  ui = dashboardPage(
    header = dashboardHeader(userOutput("user")),
    sidebar = dashboardSidebar(shinyjs::useShinyjs(),
                               sidebarMenu(id="tabs",
                                           menuItem("Tab 1", tabName = "tab1", icon = icon("dashboard")),
                                           menuItem("Tab 2", tabName = "tab2", icon = icon("dashboard")),
                                           hidden(menuItem("Personal Tab", tabName = "personal_tab", icon = icon("dashboard")))
                               )),
    body = dashboardBody(useShinyjs(),
                         tabItems(
                           tabItem(tabName ="tab1",
                                   fluidRow(box(width = 12, h4("Tab 1 (menuItem)")))),
                           tabItem(tabName ="tab2",
                                   fluidRow(box(width = 12, h4("Tab 2 (menuItem)")))),
                           tabItem(tabName ="personal_tab",
                                          fluidRow(box(width = 12, h4("Personal Info Dahsboard (no menuItem)"))))
                         )
    ),
    title = "DashboardPage"
  ),
  server = function(input, output, session) {
    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")
        )
      )
    })
    
    observeEvent(input$personalInfo, {
      shinydashboard::updateTabItems(session, inputId = "tabs", selected = "personal_tab")
    })
  }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM