【问题标题】:Hiding a menuItem after actionButton click在actionButton点击后隐藏一个menuItem
【发布时间】:2023-03-18 20:35:01
【问题描述】:

我正在构建一个应用程序,用户可以在其中看到登录页面。单击actionButton 后,我希望将用户移动到另一个menuItem 并隐藏登录页面。 shinyjs::hide() 似乎非常适合此目的,但我似乎无法让函数接受有问题的 menuItem 的名称作为要隐藏的对象的 ID。

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

## UI ##

ui <- dashboardPage(

  skin = "black",
  dashboardHeader(
    title = "Template"
  ),

  dashboardSidebar(
    sidebarMenu(id = "sidebarmenu",
      menuItem("Landingpage", tabName = "landing", icon = icon("cog")),
      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))
      )
  ),

  dashboardBody(
    useShinyjs(),
    tabItems(
      tabItem(tabName = "landing", 
              h2("Landing Page"),
              actionButton(inputId = "confirm", 
                           label = "Confirm", 
                           icon = icon("ok-circle"))
              ),
      tabItem(tabName = "dashboard", 
              h2("Dashboard Content")
              )
    )
  )
)

## Server ##

server <- function(input, output, session) { 

  observeEvent(input$confirm, {

    shinyjs::hide(id = "landing")
    updateTabItems(session, "sidebarmenu", "dashboard")

  })
}

shinyApp(ui, server)

这是我最近的尝试。我会以错误的方式解决这个问题吗? shinyjs::hide() 是正确的做法吗?

【问题讨论】:

    标签: html shiny shinydashboard shinyjs


    【解决方案1】:

    更好的方法是在用户单击确认按钮后重新呈现您的菜单。您可以使用renderMenu 函数来做到这一点。

    library(shiny)
    library(shinydashboard)
    ui <- dashboardPage(
    
      skin = "black",
      dashboardHeader(
        title = "Template"
      ),
    
      dashboardSidebar(
        sidebarMenuOutput("sidebarmenu")
      ),
    
      dashboardBody(
        tabItems(
          tabItem(tabName = "landing",
                  fluidRow(
                  h2("Landing Page"),
                  actionButton(inputId = "confirm",
                               label = "Confirm",
                               icon = icon("ok-circle")))
          ),
          tabItem(tabName = "dashboard",
                  fluidRow(
                  h2("Dashboard Content"))
          )
        )
      )
    )
    
    ## Server ##
    
    server <- function(input, output, session) { 
      output$sidebarmenu <- shinydashboard::renderMenu({
        sidebarMenu(id='sidebarmenu',
                    menuItem("Landingpage", tabName = "landing", icon = icon("cog")),
                    menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard"))
        )}
      )
    
      observeEvent(input$confirm, {
        output$sidebarmenu <- shinydashboard::renderMenu({
          sidebarMenu(id='sidebarmenu',
                      menuItem("Dashboard", tabName = "dashboard", icon = icon("dashboard")))
        })
        updateTabsetPanel(session, "sidebarmenu", "dashboard")
      })
    }
    
    shinyApp(ui, server)
    

    关于shinyjs

    您可以通过在浏览器中检查元素来检查您的 ID(右键单击 + 检查您的元素)。在您的情况下,我找不到 ID,但您可以将其包装在 div(id=shiny-tab-landing, sidebarMenu(...))

    shinyjs::hide(id = "shiny-tab-landing") 可能会起作用。

    【讨论】:

    • renderMenu 函数非常优雅!感谢您的帮助。然而,第一个解决方案对我不起作用。检查时我既看不到正确的 ID,也看不到代码执行正确。没有div,我看到的都是&lt;a href="#shiny-tab-landing" data-toggle="tab" data-value="landing" aria-expanded="true"&gt; &lt;i class="fa fa-cog"&gt;&lt;/i&gt; &lt;span&gt;Landingpage&lt;/span&gt; &lt;/a&gt;
    • 第一个解决方案不是您想要的,只是我在跟进您的shinyjs::hide 功能。我会把它放在 renderMenu 选项之后。
    • 感谢renderMenu 功能,不知道。从我的角度来看,使用shinyjs hide/show 非常方便,因为它避免了重复代码(我们需要使用renderMenu 重建整个菜单),而shinyjs 只需要目标ID(参见仪表板stackoverflow.com/questions/51946319/… 的此SO)。不幸的是,我无法理解dashboardPlus()中目标的id。
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2014-06-06
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多