跳转到内容

ResponsiveDrawer 响应式抽屉

使用 DaisyUI 的抽屉的响应式侧边栏布局。用于在移动设备上切换但在大屏幕上始终可见的导航侧边栏。

import { ResponsiveDrawer } from 'asterui'

基础响应式抽屉

在移动设备上切换的响应式侧边栏。

Main content area

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        sidebar={
          <Menu>
            <Menu.Item>Dashboard</Menu.Item>
            <Menu.Item>Settings</Menu.Item>
            <Menu.Item>Profile</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Sidebar
          </Button>
          <p className="mt-4">Main content area</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

在桌面上始终打开

侧边栏在移动设备上切换,但在 lg 屏幕及以上始终可见。

Resize the window to see the responsive behavior. On large screens, the sidebar is always visible.

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        responsive="lg"
        sidebar={
          <Menu>
            <Menu.Title>Navigation</Menu.Title>
            <Menu.Item>Dashboard</Menu.Item>
            <Menu.Item>Analytics</Menu.Item>
            <Menu.Item>Settings</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button className="lg:hidden" onClick={() => setOpen(true)}>
            Menu
          </Button>
          <p className="mt-4">
            Resize the window to see the responsive behavior.
            On large screens, the sidebar is always visible.
          </p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

自定义宽度

具有自定义宽度的侧边栏。

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        width={400}
        sidebar={
          <Menu>
            <Menu.Title>Wide Sidebar</Menu.Title>
            <Menu.Item>Item with more space</Menu.Item>
            <Menu.Item>Another item</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Wide Sidebar
          </Button>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

右侧侧边栏

位于右侧的侧边栏。

Main content area

import { ResponsiveDrawer, Button, Menu } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        end
        sidebar={
          <Menu>
            <Menu.Item>Info Panel</Menu.Item>
            <Menu.Item>Quick Actions</Menu.Item>
            <Menu.Item>Help</Menu.Item>
          </Menu>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Open Right Sidebar
          </Button>
          <p className="mt-4">Main content area</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App

自定义侧边栏内容

具有自定义样式内容的侧边栏。

Application content

import { ResponsiveDrawer, Button, Avatar } from 'asterui'
import { useState } from 'react'

function App() {
  const [open, setOpen] = useState(false)
  
  return (
      <ResponsiveDrawer
        open={open}
        onOpenChange={setOpen}
        sidebarClassName="bg-base-300"
        sidebar={
          <div className="space-y-4">
            <div className="flex items-center gap-3">
              <Avatar>JD</Avatar>
              <div>
                <div className="font-semibold">John Doe</div>
                <div className="text-sm opacity-70">Admin</div>
              </div>
            </div>
            <ul className="menu">
              <li><a>Dashboard</a></li>
              <li><a>Users</a></li>
              <li><a>Reports</a></li>
              <li><a>Settings</a></li>
            </ul>
          </div>
        }
      >
        <div className="p-4">
          <Button onClick={() => setOpen(true)}>
            Toggle Sidebar
          </Button>
          <p className="mt-4">Application content</p>
        </div>
      </ResponsiveDrawer>
    )
}

export default App
属性描述类型默认值
children主内容区域React.ReactNode-
sidebar侧边栏内容React.ReactNode-
open受控打开状态booleanfalse
onOpenChange打开状态更改时的回调(open: boolean) => void-
end将侧边栏定位在右侧booleanfalse
width侧边栏的宽度number | string320
responsive侧边栏变为始终可见的断点'sm' | 'md' | 'lg' | 'xl' | '2xl'-
sidebarClassName侧边栏容器的额外类string-
contentClassName内容区域的额外类string-
overlayClassName覆盖层的额外类string-
id抽屉的唯一 ID(如果未提供则自动生成)string-
className抽屉包装器的额外 CSS 类string-
data-testid用于测试的测试 IDstring-
  • ResponsiveDrawer 包装了 DaisyUI 的 drawer 组件
  • 使用 openonOpenChange 进行受控状态
  • 使用 responsive 属性使侧边栏在某个断点之上始终可见
  • 使用 width 自定义侧边栏宽度(默认: 320px)
  • 使用 end 属性将侧边栏定位在右侧
  • 对于在内容上滑动的面板抽屉(如表单或详细视图),请改用 Drawer 组件
功能ResponsiveDrawerDrawerLayout.Sider
用例响应式导航侧边栏表单、详情的覆盖面板永久可折叠侧边栏
渲染页面布局的一部分传送到 document.bodyLayout 结构的一部分
覆盖层是(移动设备)是(始终)
响应式是(在断点自动打开)是(自动折叠)
位置左或右全部 4 个方向左或右
页眉/页脚无内置是(title、footer 属性)无内置