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

bslib中nav_select选中nav_menu内标签后下拉菜单无法关闭的问题咨询

解决bslib中nav_select触发嵌套nav_menu标签后下拉菜单不自动关闭的问题

问题现象

使用nav_select()从服务器端选中嵌套在nav_menu内的标签时,页面成功切换到目标标签内容,但对应的nav_menu下拉列表会保持展开状态,点击页面其他区域无法关闭该下拉菜单,仅能通过再次点击nav_menu按钮收起。

复现代码

library(shiny)
library(bslib)
library(rlang)
library(shinyjs)

nav_items <- function(prefix) {
  list(
    nav("a", tagList(
      paste(prefix, ": tab a content"),
      actionButton(inputId = "go_to_tab_c", label = "Go to tab C")
    )),
    nav("b", paste(prefix, ": tab b content")),
    nav_item(
      tags$a(icon("github"), "Shiny", href = "https://github.com/rstudio/shiny", target = "_blank")
    ),
    nav_spacer(),
    nav_menu(
      value = "ya",
      title = "Other links",
      align = "right",
      nav("c", paste(prefix, ": tab c content")),
      nav_item(
        tags$a(
          icon("r-project"),
          "RStudio",
          href = "https://rstudio.com",
          target = "_blank"
        )
      )
    )
  )
}

ui <- page_fluid(
  shinyjs::useShinyjs(),
  page_navbar(
    id = "main_nav",
    title = "Page",
    bg = "#0062cc",
    !!!nav_items(prefix = "page_navbar")
  )
)

server <- function(input, output, session) {
  observeEvent(input$go_to_tab_c, {
    nav_select(id = "main_nav", selected = "c")
  })
}

shinyApp(ui, server)

解决方法

利用shinyjs执行JavaScript代码,在调用nav_select()后手动关闭对应的nav_menu下拉菜单。修改server部分代码如下:

server <- function(input, output, session) {
  observeEvent(input$go_to_tab_c, {
    nav_select(id = "main_nav", selected = "c")
    # 精准定位目标nav_menu并关闭下拉菜单
    shinyjs::runjs("
      // 找到value为'ya'的nav_menu元素
      const navMenu = document.querySelector('[data-value=\"ya\"]');
      if (navMenu) {
        // 移除父元素的show类以收起下拉
        navMenu.parentElement.classList.remove('show');
        // 移除下拉菜单的show类
        const dropdownMenu = navMenu.nextElementSibling;
        if (dropdownMenu && dropdownMenu.classList.contains('dropdown-menu')) {
          dropdownMenu.classList.remove('show');
        }
      }
    ")
  })
}

说明

这个问题属于bslib组件交互的小瑕疵,nav_select()仅处理了标签切换逻辑,未同步更新nav_menu的展开状态。通过手动操作DOM元素移除Bootstrap下拉菜单的show类,可以确保下拉菜单在标签切换后自动收起,符合预期交互行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:38