单击 actionButton 后隐藏 menuItem

Hiding a menuItem after actionButton click

我正在构建一个应用程序,在该应用程序中,用户会看到登陆页面。单击 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() 这样做是否正确?

更好的方法是在用户单击确认按钮后重新呈现您的菜单。您可以使用 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") 可能会起作用。