reactable单元格内的渲染按钮为何无法通过observeEvent触发modalBox?
问题根因
- Shiny 仅在页面首次加载时自动扫描全局DOM完成输入控件的绑定,reactable 的单元格内容是渲染过程中动态插入DOM的,这部分后插入的按钮没有经过Shiny的输入绑定流程,因此点击事件无法被Shiny捕获同步到
input对象。 - 你为所有行的按钮设置了相同的固定ID
character,违反了HTML DOM ID必须全局唯一的规范,即使绑定成功也仅能触发首个匹配ID按钮的事件,无法适配多按钮场景。
修复方案
不需要依赖Shiny的自动绑定,直接在按钮的点击事件中主动调用JS接口Shiny.setInputValue向Shiny服务端推送事件即可,同时可以直接携带当前行的标识信息(比如角色名称),修复后可运行代码如下:
library(shiny) library(reactable) library(tidyverse) data = dplyr::starwars %>% select(name, height, mass, sex, species, homeworld) ui = fluidPage( column(width = 6, style = "margin-top: 50px;", reactableOutput("table")) ) server = function(input, output, session){ output$table = renderReactable({ reactable(data = data, height = 600, defaultPageSize = 20, columns = list( name = colDef( cell = function(value){ tags$button( value, class = "action-button", # 点击时主动推送输入值,priority: event保证相同值也能触发observe onclick = sprintf("Shiny.setInputValue('character', '%s', {priority: 'event'})", value) ) })))}) observeEvent(input$character, { # 可以直接用input$character拿到当前点击的角色名 showModal(modalDialog(title = paste("你选中了:", input$character))) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者werN
相关产品推荐
相关产品推荐

