R Shiny多选selectInput如何实现用户完成多选后再禁用的功能
解决方案
问题原因
原代码中observeEvent绑定的是input$check1的值变化事件,只要选中第一个选项触发值变化,就会立即执行禁用逻辑,因此无法继续多选。
方案1:监听失焦事件自动禁用(无需额外按钮)
当用户完成多选后点击页面任意其他位置,选择框失去焦点时自动触发禁用,多选过程中只要不点击选择框外的区域就可以持续选多个选项:
library(shiny) library(shinyjs) ui <- fluidPage( br(), useShinyjs(), fluidRow( column( width = 6, selectInput(inputId = "check1", label = "Choose", choices = c("choice A","choice B","choice C"),multiple = T), verbatimTextOutput(outputId = "res1") ) ) ) server <- function(input, output, session) { flag_lifecycle <- reactiveValues(val = "Yes") output$res1 <- renderPrint({ input$check1 }) # 监听selectInput的失焦事件,选完点其他地方才禁用 observeEvent(input$check1, { # 只有当用户至少选了一个选项后,才绑定失焦禁用逻辑 shinyjs::onevent("blur", "check1", { if (!is.null(input$check1)) { shinyjs::disable("check1") } }) }, once = TRUE) # 只绑定一次事件,避免重复触发 } shinyApp(ui = ui, server = server)
方案2:新增确认按钮手动触发禁用
逻辑更清晰,用户明确知道需要点击确认完成选择,适合对操作流程要求明确的场景:
library(shiny) library(shinyjs) ui <- fluidPage( br(), useShinyjs(), fluidRow( column( width = 6, selectInput(inputId = "check1", label = "Choose", choices = c("choice A","choice B","choice C"),multiple = T), actionButton(inputId = "confirm", label = "确认选择"), verbatimTextOutput(outputId = "res1") ) ) ) server <- function(input, output, session) { flag_lifecycle <- reactiveValues(val = "Yes") output$res1 <- renderPrint({ input$check1 }) observeEvent(input$confirm, { req(input$check1) # 至少选一个才允许禁用 shinyjs::disable("check1") }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Rajkumar ManiRaja
相关产品推荐
相关产品推荐

