根据输入动态改变侧边栏宽度

Dynamically changing sidebar width based on an input

有没有根据输入值动态改变侧边栏宽度的方法?在下面的示例中,我希望侧边栏的宽度基于 sidebarWidth 输入:

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(width = 230),
  dashboardBody(
    numericInput("sidebarWith", "Select Sidebar Width", min = 300, max = 500, value = 230)
  )
)

server <- function(input, output) { }

shinyApp(ui, server)

我想你可以尝试以下方法。在 ui 中使用 uiOutput 以动态更改 serverrenderUI。请注意,我更正了示例中 sidebarWidth 的拼写。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  header = dashboardHeader(),
  sidebar = uiOutput("sidebar"),
  body = dashboardBody(
    numericInput("sidebarWidth", "Select Sidebar Width", min = 300, max = 500, value = 230)
  )
)

server <- function(input, output) {
  output$sidebar <- renderUI({
    dashboardSidebar(width = input$sidebarWidth)
  })
}

shinyApp(ui, server)

让我们试试这个快速、响应迅速、无服务器代码的版本,纯粹 Javascript。

library(shiny)
library(shinydashboard)

ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(width = 230),
    dashboardBody(
        numericInput("sidebarWith", "Select Sidebar Width", min = 230, max = 500, value = 230),
        tags$script(HTML(
        '
        $(function(){
            var mainContent = $(".wrapper > .content-wrapper");
            var curWidth = 230;
            $("#sidebarWith").on("change", function() {
                if(parseFloat($(this).val()) < 230 || parseFloat($(this).val()) > 500) {return false}
                curWidth = $(this).val();
                mainContent.css("margin-left", `${curWidth}px`);
                $(".main-header .navbar").css("margin-left", `${curWidth}px`);
                $(".main-header .logo").css("width", `${curWidth}px`);
            });
            $(".sidebar-toggle").on("click", function() {
                if(!$("body").hasClass("sidebar-collapse")) {
                    mainContent.css("margin-left", `0px`);
                    $(".main-header .navbar").css("margin-left", `0px`);
                    $(".main-header .logo").css("width", `0px`);
                } else {
                    mainContent.css("margin-left", `${curWidth}px`);
                    $(".main-header .navbar").css("margin-left", `${curWidth}px`);
                    $(".main-header .logo").css("width", `${curWidth}px`);
                }
            })
        });
        '
        ))
    )
)

server <- function(input, output) { }

shinyApp(ui, server)
  1. 不需要服务器代码。应用UI,服务器分离设计:如果只用UI就能解决问题,就在UI做。 UI only 解决方案通常比 UI-server 通信具有更好的性能和速度。
  2. 我注意到顶部有一个折叠边栏的按钮,因此我进行了相应的更改。单击它时,它会折叠并恢复到您在数字输入中设置的正确宽度。
  3. 单击折叠按钮时,左侧的原始页眉不会折叠,其宽度也不会改变。我使它与侧边栏的宽度对齐,并在您单击按钮时使其折叠。